为什么我的输入变量属性未定义(角度)

问题描述 投票:0回答:2

我正在从应用程序组件中的服务中获取数据,然后通过@Input将其传递给子组件。当我在ngOnInit中console.log数据时,它确实显示在子组件中,但是当我尝试将其传递给变量并在子模板中使用它时,它又返回未定义状态,我不确定为什么。

在这里我在app.component.ts中调用我的服务,有问题的数据是this.colorcounts。 ngOnInit内部的控制台日志记录显示正确的数据。 colorCounts具有3个属性:红色,黄色和绿色:

ngOnInit() {

    this.pciService.getPciInfo()
            .subscribe((pciInfo) => {
              this.spinner.hide();
              this.pciData = pciInfo.sorted,
              this.colorCounts = pciInfo.counts;
            });

这是app.component.html模板,我在其中向下传递数据:

<app-navbar *ngIf="colorCounts" [colorCounts] = "colorCounts"></app-navbar>
<app-system-status [pciData]="pciData"></app-system-status>

这是我要在其中捕获数据的子组件,在ngOnInit中执行console.log确实可行,但是尝试在模板中使用“红色”或将其保存在类中会返回未定义的状态:


  constructor(private pciService: PciService,
              public dialog: MatDialog,
              private decimalPipe: DecimalPipe) { }

  AMVersion: any;
  @Input() colorCounts: Colors;


  openDialog(): void {
    let dialogRef = this.dialog.open(AmVersionDialogComponent, {
      panelClass: 'custom-dialog-container',
      data: {}
    });

    (<AmVersionDialogComponent>dialogRef.componentInstance).AMVersion = this.AMVersion;
    dialogRef.afterClosed().subscribe(result => {
      console.log('The dialog was closed');
    });
  }


  ngOnInit() {
    this.pciService.getAMVersion()
    .subscribe((AMInfo) => {
     return this.AMVersion = AMInfo;
    });
    var red = this.colorCounts.red;
    console.log(red)
    console.log(this.colorCounts);
  }

}

我知道我可能缺少有关生命周期的一些简单信息。有人可以在这里指出正确的方向吗?

javascript angular typescript input service
2个回答
0
投票

[所有可观察对象都是异步的,因此在模板*ngIf中,条件将检查变量,如果它为null,则将返回null,但是如果将变量传递为| async,它将一直在检查该变量。

实施例:

<ng-container *ngIf="Observable$ | async as obs">
<app-navbar [colorCounts]="obs.counts"></app-navbar>
</ng-container>

在您的应用程序中:

<app-navbar *ngIf="colorCounts | async" [colorCounts]="colorCounts"></app-navbar>

您需要知道这是一个锅炉代码:

ngOnInit() {

    this.pciService.getPciInfo()
            .subscribe((pciInfo) => {
              this.spinner.hide();
              this.pciData = pciInfo.sorted,
              this.colorCounts = pciInfo.counts;
            });

最好这样做:

ngOnInit() {
this.pciInfo$ = this.pciService.getPciInfo()
}

在模板中:

<ng-container *ngIf="pciInfo$ | async as pciInfo">
<app-navbar [colorCounts]="colorcount"></app-navbar>
</ng-container>

管道异步将为您订阅可观察的对象。


-1
投票

尝试一下

  @Input('colorCounts) colorCounts: Colors;
© www.soinside.com 2019 - 2024. All rights reserved.