【问题标题】:Angular 2+ access @Input Data.Property with [(ngModel)]Angular 2+ 使用 [(ngModel)] 访问 @Input Data.Property
【发布时间】:2017-08-13 20:36:50
【问题描述】:

我有一个声明如下的组件,它接收输入数据。我正在使用 Primeng 日历组件, 它创建的组件,但我无法访问数据以将其传递给模板 我在 [(ngModel)]="data.DateValue" 上收到错误,就像访问时 DataValue 不存在

缺少什么?

在接收到输入数据后,如何设置一个Date类型的辅助值(myDateValue: Date)?

提前致谢。

import { Component, Input} from '@angular/core';
import { DataType } from "../model/dataType";

@Component({
  selector: 'exempleComponent',
  template: '<p-calendar *ngIf="data"  [(ngModel)]="data.DateValue" dateFormat="dd.mm.yy"></p-calendar>'

})
export class ExempleComponent {

  @Input() data: DataType;

  constructor() { }


}

父组件:

import { Component, OnInit } from '@angular/core';
import { WebService } from './app.service';
import { MasterDataType } from "../model/masterDataType";

@Component({
    selector: 'my-app',
    template: '<div> <exempleComponent [data]="theData.DataType" ><exempleComponent/> </div>',
    providers: [WebService]

})
export class AppComponent implements OnInit {
    errorMessage: string;
    theData: MasterDataType;

    constructor(private dataService: WebService) {}

    ngOnInit() { this.getDataFromService(); }
    getDataFromService() {
        this.dataService.getData ()
            .subscribe(
            myData => this.theData = myData,
            error => this.errorMessage = <any>error);
    }    
}

【问题讨论】:

  • 我添加了父组件,我不认为它是父组件,因为我有其他组件可以正确接收数据,例如:模板上的 value={{data?.Value}}
  • [(ngModel)]="data.DateValue" 有什么特别之处吗?
  • Correction [(ngModel)]="data.DateValue" 实际上工作正常

标签: angular components primeng


【解决方案1】:

问题已被指出。 data 变量未定义。 您应该阅读有关生命周期挂钩的更多信息。

虽然您的子组件 (ExempleComponent) 在 ngAfterContentInit 加载,但此时 theData 变量仍未定义,因为您的服务调用尚未完成(或订阅)。

例如:

data: SomeType;
ngOnInit() {
  console.log('START ngOnInit');
  this.service.getData().subscribe(_data => {
    this.data = _data;
    console.log('data', this.data);
  });
  console.log('END ngOnInit');
}

以上代码的结果是:

START ngOnInit

END ngOnInit

data Object

解决方法是加载后必须绑定数据。

解决方案 1:

初始化theData.DataType。给它一个默认值。

解决方案 2:

[(ngModel)]="data?.DateValue"。这是为了检查data 变量是否可用(不是未定义或为空)。

解决方案 3:

您应该考虑使用有助于在加载组件之前加载数据的数据解析器。

解决方案 4:

防止在加载其输入数据之前加载子组件

【讨论】:

  • 我最终传递了一个 @Input() dateValue: string;给孩子,它奏效了。但我看不出传递 object.property 或 property 之间的区别
  • 它们彼此不同。如果您使用 @Input() dateValue: string,它会很好地工作。但是,它不起作用,因为你给它一个像 @Input() data: any 的输入。原因是:子组件Example Component的模板是在输入数据传入之前加载的。因此,结果是: data 将被 assigned 为未定义。然后,您使用 [(ngModel)]="data.DataType"。它将抛出异常,因为 data 变量未定义
  • 事实上,我的问题是我有一个动态组件工厂,它创建了我所有的组件,我在将输入数据设置为组件之前调用了 .detectChanges(),有些是这样工作的,但现在设置数据并在调用后 detectChanges() 解决了我所有的问题。无论如何,这里的讨论让我想到了我的代码。需要做一些 plunker 来分享我的代码。
猜你喜欢
  • 2017-06-24
  • 2019-07-08
  • 1970-01-01
  • 2019-01-15
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
相关资源
最近更新 更多