javascript - @Input() 未按预期在 Angular 2 应用程序中的父子组件之间传递

标签 javascript angular parent-child

我正在尝试抽象出一个表格数据显示,使其成为一个可以加载到各种父组件中的子组件。我这样做是为了让整个应用程序“更干燥”。在我使用可观察对象订阅服务并进行 API 调用,然后直接打印到每个组件 View (每个组件 View 都有表格布局)之前。现在我想使表格数据区域成为子组件,并为每个父组件绑定(bind)可观察的结果。无论出于何种原因,这都没有按预期工作。

这是我在父组件 View 中的内容:

<div class="page-view">
    <div class="page-view-left">
        <admin-left-panel></admin-left-panel>
    </div>
    <div class="page-view-right">
        <div class="page-content">
            <admin-tabs></admin-tabs>
            <table-display [records]="records"></table-display>
        </div>
    </div>
</div>

组件文件如下所示:

import { API } from './../../../data/api.service';
import { AccountService } from './../../../data/account.service';
import { Component, OnInit, Input } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { TableDisplayComponent } from './../table-display/table-display.component';

@Component({
  selector: 'account-comp',
  templateUrl: 'app/views/account/account.component.html',
  styleUrls: ['app/styles/app.styles.css']
})
export class AccountComponent extends TabPage implements OnInit {

    private section: string;
    records = [];
    errorMsg: string;

    constructor(private accountService: AccountService,
                router: Router,
                route: ActivatedRoute) {
    }

    ngOnInit() {
       this.accountService.getAccount()
            .subscribe(resRecordsData => this.records = resRecordsData,
            responseRecordsError => this.errorMsg = responseRecordsError);
    }
}

然后,在子组件(包含表显示 View 的组件)中,我包含一个用于“记录”的 @Input() - 这是我的可观察对象的结果在父组件中分配给的内容。所以在子(表格显示)组件中,我有这个:

import { AccountService } from './../../../data/account.service';
import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'table-display',
  templateUrl: './table-display.component.html',
  styleUrls: ['./table-display.component.less']
})
export class TableDisplayComponent {

    @Input() records;

    constructor() {
    }

}

最后,这是我的表格显示 View 中的一些相关代码:

<tr *ngFor="let record of records; let i = index;">
<td>{{record.name.first}} {{record.name.last}}</td>
                <td>{{record.startDate | date:"MM/dd/yy"}}</td>
                <td><a class="bluelink" [routerLink]="['/client', record._id ]">{{record.name.first}} {{record.name.last}}</a></td>

当我将它与此配置一起使用时,我通过 API/数据库获取的“记录”属性出现“未定义”错误。当我在同一个组件中同时显示表格和调用服务时,我没有收到这些错误。所以我在这里所做的只是抽象出表格显示,这样我就可以在几个父组件中嵌套使用它,而不是让同一个表格显示完整地显示在每个需要它的父组件中。

我在这里错过了什么?此配置中有什么问题?

最佳答案

您需要防止记录为空,直到它进入您的子组件(因此它是 View )。

使用 Elvis 运算符来保护您的模板:

<tr *ngFor="let record of records; let i = index;">
    <td>{{record?.name?.first}} {{record?.name?.last}}</td>
    <td>{{record?.startDate | date:"MM/dd/yy"}}</td>
    <td><a class="bluelink" [routerLink]="['/client', record?._id ]">  {{record?.name?.first}} {{record?.name?.last}}</a></td>

您还可以将您的输入分配给一个空数组以帮助解决此问题:

@Input() 记录 = [];

关于javascript - @Input() 未按预期在 Angular 2 应用程序中的父子组件之间传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42034809/

相关文章:

javascript - async.js waterfall 中未处理的 promise 拒绝警告

javascript - 在 Canvas 中缩放矩形

javascript - 如何修复 Angular Material Components 的构建错误?

html - CSS 指的是每个奇怪的嵌套子项?

javascript - NodeJS - 如何通过执行的查询获得 mysql 结果?

javascript - 在 jQuery 中使用整数字符串类型对数组进行排序

javascript - 没有为 node_modules 中的库定义 Angular2 require

javascript - 嵌入 Google 地球,在卫星 View 中创建网格布局

mysql - 更新子表中的parentID并从父表中删除重复行