首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角ngIf:标识符“长度”未定义

角ngIf:标识符“长度”未定义
EN

Stack Overflow用户
提问于 2020-12-09 13:11:01
回答 1查看 920关注 0票数 2

我的组件具有属性传输$,它是一个可以观察到的属性,可以与包含错误消息的数组或对象一起使用。我只能在传输$ is Transfer[]时输入项。但即使使用条件

代码语言:javascript
复制
<app-checklist *ngIf="transfers?.length > 0" [items]="transfers"></app-checklist>

角继续警告:

未定义标识符“长度”。'Transfer[] \ AppResponseError‘不包含这样的成员

为什么会这样呢?

谢谢

component.html

代码语言:javascript
复制
<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:

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { of } from 'rxjs';

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

component.ts

代码语言:javascript
复制
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);
    });
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-09 13:23:18

你不需要额外的*如果。

代码语言:javascript
复制
<div *ngIf="transfers$ | async; let transfers; else loadingTpl">

这将做的是等到transfers$颇具异步的评估,并将结果绑定到传输的值(非美元-后缀)。

在ts文件中创建下面的函数。

代码语言:javascript
复制
isDataAvailable(arr){
 return Array.isArray(arr) && arr.length >0
}

并像这样在模板中使用它

代码语言:javascript
复制
<app-checklist *ngIf="isDataAvailable(transfers)" [items]="transfers"></app-checklist>
代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65217484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档