目前我有两个可观察者。一个返回客户端列表,另一个在文本更改时触发。
我想发出客户端的完整结果,然后在用户开始过滤后切换到内部observable。
我也试图对所输入的文字进行辩解。
我把一些无法尝试解释的东西放在一起。目前它只在我开始输入文本时显示客户端。
let obs = Observable.fromPromise(this.clientService.getClients())
.map((clients) => {
return clients.map((c) => new Client().fromObject(c));
});
this.clients = obs.switchMap((values) => {
return this.searchText.valueChanges
.debounceTime(400)
.distinctUntilChanged()
.map((text) => {
return values.filter((c) => c.isMatch(text));
});
});
答案 0 :(得分:2)
你需要将你的观察者合并在一起:
let obs = Observable.fromPromise(this.clientService.getClients())
.map((clients) => {
return clients.map((c) => new Client().fromObject(c));
}).share();
let filtered = obs.switchMap((values) => {
return this.searchText.valueChanges
.debounceTime(400)
.distinctUntilChanged()
.map((text) => {
return values.filter((c) => c.isMatch(text));
});
});
this.clients = Observable.merge(obs,filtered);
首先,您需要使用share
运算符来避免两次提取客户端(请参阅进一步编辑)。那么您需要从obs
和filtered
获取值。这是merge
的用途:
创建一个输出Observable,它同时发出每个给定输入Observable的所有值。
通过将多个Observable的值混合到一个Observable中来展平它们。
编辑:在这种特定情况下,share
部分不是必需的,因为OP使用promise作为可观察源,承诺不会被订阅触发,它们是{{3并且不需要共享。但是,如果您正在处理其他可观察的来源(如角度Http
服务的方法,则可能需要share
。