在RxJS 5本最佳候選是combineLatest()
操作者(它有靜態和實例方法變體),當任何其源觀測量的發射值,該值調用其選擇器的功能。
let userInput$ = Observable.from(['a', 'ac', 'aca', 'acarp'])
.concatMap(char => Observable.of(char).delay(500))
.startWith(null);
let list$ = Observable.of(['abstemious', 'abstentious', 'abulia', 'abut', 'aby', 'acalculia', 'acarophobia', 'acarpous', 'accidence', 'accismus', 'acclamation']);
let filteredList$ = Observable.combineLatest(list$, userInput$, (list, filterString) => {
if (filterString) {
// Note that this is Array.filter() method, not an RxJS operator
return list.filter(name => name.indexOf(filterString) === 0);
}
return list;
});
filteredList$.subscribe(val => console.log(val));
見現場演示:https://jsbin.com/jihuxu/2/edit?js,console
這是模擬的情況下每500ms用戶鍵入一個字符,並相應地過濾list$
。請注意,list$
也可以發出一個新的數組,可以立即進行過濾。
需要注意的一件重要的事情是,每個源Observable必須發出至少一個值,然後.combineLatest()
才能發出每個更改。這就是爲什麼我也有startWith(null)
,爲了確保選定的過濾器在開始時是null
。
除非有一些功能你不能實現,除非你使用observables我認爲你的方法聽起來不錯。您可以爲displayList創建一個BehaviorSubject,例如'displayList = new BehaviorSubject([])'並用'displayList.next(newDisplayList)'更新它。然後,您可以在displayFormat | async「'中用'* ngFor =」項在ngFor中綁定它。但我不一定會看到這種方法的好處 – rob