我有以下代码:
this.itemsService.getItems()
.subscribe(i => this.items = i);
但是,用户可以选择一种项目,所以我有一个事件发射器:
this.typeofitems.selectedType.subscribe(type => this.type = type);
它运作良好。
现在,我想使用this.items
过滤项目列表filter function
。问题是,我不知道项目装载完成的时间,如果我在订阅中记录了日志:
this.itemsService.getItems()
.subscribe(i => {this.items = i; console.log("completed");});
它表明我已经完成了。所以我试过了:
this.itemsService.getItems()
.subscribe(i => {
this.items = i;
this.typeofitems.selectedType.subscribe(type => {
this.type = type;
this.filterByType();
});
});
filterByType() {
this.itemsfilteredByType = this.items.filter(i => i.type === this.type)
}
但它不起作用。所以我想我不能在下标中订阅。 我怎样才能实现它?
答案 0 :(得分:2)
请注意,您在 /*DOCUMENTS*/
documentsFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
fileCount = Directory.GetFiles(documentsFolder, "*.*", SearchOption.AllDirectories).Length; //THIS IS WHERE IT FAILS - DOES NOT GET PAST HERE
MessageBox.Show(fileCount.ToString()); //THIS NEVER SHOWS
回调中使用的是=
而不是==
,因此请确保这不是问题。
无论如何,你可以使用运算符combineLatest()
,每当它的任何一个源发出一个值时都会发出一个值(而每个源必须至少发出一个值):
filter()
按function getItems() {
return Observable.of([{type: 1, val: 345}, {type: 2, val: 107}, {type: 1, val: 926}, {type: 2, val: 456} ]);
}
let typeOfItems = new Subject();
Observable.combineLatest(getItems(), typeOfItems)
.subscribe(vals => {
let [items, typeOfItem] = vals;
let results = items.filter(i => i.type == typeOfItem);
console.log(results);
});
typeOfItems.next(2);
过滤项目并打印到控制台:
type == 2
感谢[[object Object] {
type: 2,
val: 107
}, [object Object] {
type: 2,
val: 456
}]
首先接收所有项目,然后我告诉它使用combineLatest()
按type == 2
过滤它们,这会触发调用typeOfItems.next(2);
的回调使用combineLatest()
实际过滤和打印已过滤的项目(请注意,这是Array.filter()
而不是Array.fitler()
)。
查看现场演示:https://jsbin.com/nenosiy/5/edit?js,console
顺便说一下,你当然可以Observable.filter()
在另一个subscribe()
回调中。请记住,您必须手动取消订阅之前的订阅。
查看一个非常相似的问题:Dynamically filtering rxjs stream