在Angular中,* ngFor =“let item from list | async”是什么意思?

时间:2018-03-29 01:43:53

标签: angular typescript ngfor

此代码示例中使用了https://stackblitz.com/angular/jdamnnmgrae?file=app%2Fautocomplete-overview-example.ts

有问题的代码段是:

<mat-option *ngFor="let state of filteredStates | async" [value]="state.name">

我还没有看到这种语法,所以我对它的作用感到困惑。当我删除异步调用时,代码不再有效,所以我需要理解它。

我认为这段代码正在创建一个Observable列表,这些Observable正被发送到异步管道,但我还没有看到Angular的文档中记录的位置。如果您知道,请回复。

import {map} from 'rxjs/operators/map';

export class AutocompleteOverviewExample {
// . . . other stuff omitted
  filteredStates: Observable<any[]>;

  constructor() {
    this.filteredStates = this.stateCtrl.valueChanges
    .pipe(
      startWith(''),
      map(state => state ? this.filterStates(state) : this.states.slice())
   );

因此,for循环可能会循环遍历Observables,因为Async管道采用Promise或Observable,而且它不是Promise。 : - )

有用的链接:

我无法找到FormControl.valueChanges中管道的使用方式,但希望在回答这个问题后这会变得清晰。

(问)有人能指出一些Angular文档来解释“* ngFor | async”语法的含义吗?或提供解释。

搜索答案显示了这些结果

1 个答案:

答案 0 :(得分:3)

可以将let state of filteredStates | async语法视为:

let state of (filteredStates | async)

async管道应用于filteredStates变量,而不是整个for循环。

我认为在查看您查看的所有其他资源之后应该很明显,但async管道很有用,因为它会为您订阅observable(并另外清理订阅以便您不要#39; t需要担心取消订阅)。

所以,正在发生的是Angular正在订阅你的filteredStates可观察对象。每次从您的observable流式传输新列表时,Angular *ngFor指令将遍历流式传输的列表。

如果没有异步管道,您只需订阅组件中的filteredStates observable,并将列表存储为组件的属性(然后您将循环代替filteredStates | async )。 注意:有几种方法可以处理取消订阅,这只是一种方式。

<mat-option *ngFor="let state of filteredStates" [value]="state.name">
class AutocompleteOverviewExample {
    filteredStates: State[] = [];
    subscription: Subscription = null;

    constructor() {
        this.subscription = this.stateCtrl.valueChanges
        .pipe(
            startWith(''),
            map(state => state ? this.filterStates(state) : this.states.slice())
        )
        .subscribe(states => this.filteredStates = states);
    }

    ngOnDestroy() {
        if (this.subscription) {
            this.subscription.unsubscribe();
            this.subscription = null;
        }
    }
}