簡體   English   中英

Angular ngIf:未定義標識符“長度”

[英]Angular ngIf: Identifier 'length' is not defined

我的組件具有屬性 transfer$ ,它是可觀察到的,可以帶有包含錯誤消息的數組或 object 。 當transfers$為Transfer[]時,我只能輸入[items]。 但即使使用條件

<app-checklist *ngIf="transfers?.length > 0" [items]="transfers"></app-checklist>

angular 繼續警告:

未定義標識符“長度”。 '轉移[] | AppResponseError' 不包含這樣的成員

這是為什么?

謝謝

組件.html

<ng-template #loadingTpl>loading</ng-template>

<ng-template #emptyList let-length="length">
    <p *ngIf="length === 0">Empty List</p>
</ng-template>

<ng-template #error let-title="title" let-message="message" let-code="code">
    <div *ngIf="code">
        Error: {{code}} , {{title}} , {{message}}
    </div>
</ng-template>

<div *ngIf="transfers$ | async; let transfers; else loadingTpl">
    <app-checklist *ngIf="transfers?.length > 0" [items]="transfers">
        <div *ngFor="let transfer of transfers">
            ..something here
        </div>
    </app-checklist>
    <ng-container *ngTemplateOutlet="emptyList; context: {length: transfers.length}"></ng-container>
    <ng-container *ngTemplateOutlet="error; context:transfers"></ng-container>
</div>

TransferService.ts:

import { Injectable } from '@angular/core';
import { of } from 'rxjs';

@Injectable()
export class TransfersService {
  transfers$ = of('real observable');
}

組件.ts

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { TransfersService } from './TransfersService';

export interface AppResponseError = {code:number,title:string,message:string};
export interface Transfer = {id:number,title:string};

@Component({
  selector: 'app-transfer',
})
export class TransferComponent implements OnInit {
  transfers$: Observable<Transfer[] | AppResponseError>;
  constructor(private transfersService: TransfersService) {
    this.transfers$ = this.transfersService.transfers$;
  }

  ngOnInit() {
    this.transfers$.subscribe((data) => {
      console.log(data);
    });
  }
}

您不需要額外的 *ngIf。

<div *ngIf="transfers$ | async; let transfers; else loadingTpl">

這將做的是等到轉帳$ | async 已評估,並將結果綁定到 transfer 的值(非美元后綴)。

在 ts 文件中創建下面的 function。

isDataAvailable(arr){
 return Array.isArray(arr) && arr.length >0
}

並像這樣在模板中使用它

<app-checklist *ngIf="isDataAvailable(transfers)" [items]="transfers"></app-checklist>
<div *ngIf="transfers$ | async; let transfers; else loadingTpl">
        <app-checklist *ngIf="isDataAvailable(transfers)" [items]="transfers"></app-checklist>
        <div *ngFor="let transfer of transfers">
            ..something here
        </div>
    <ng-container *ngTemplateOutlet="emptyList; context: {length: transfers.length}"></ng-container>
    <ng-container *ngTemplateOutlet="error; context:transfers"></ng-container>
</div>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM