9

我正在使用 Typescript 学习 Angular 5。我正在尝试实现一个角度材料自动完成,我发现以下代码对我来说非常模糊:

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

完整的代码可以在这里找到:https ://stackblitz.com/angular/mdokmnyajmd?file=app%2Fautocomplete-overview-example.ts

我倾向于认为,当 stateCtrl 发生更改时,当且仅当在自动完成中选择了具体元素时,它才会返回 filterStates(state) 结果。

我不明白的是 startWith('') 的使用?!为什么不在 valueChanges 上简化调用订阅?

4

1 回答 1

17

valueChanges最初不会发出任何值(直到状态实际改变)。当您需要从初始状态计算某些内容时,您可以使用startWithobservable 发出一个值,即使它通常不会发出。

如果要在没有 的情况下处理初始值startWith,可以创建另一个流

Observable.of(stateCtrl.value).pipe(
  map(state => state ? this.filterStates(state) : this.states.slice())
);

它只会发出一个值。但是同时处理这两种情况更容易,所以这startWith是一个很好的方法......

于 2018-01-26T16:42:29.427 回答