加载数组时订阅事件发射器

时间:2016-11-11 13:01:59

标签: angular typescript rxjs rxjs5

我有以下代码:

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)
}

但它不起作用。所以我想我不能在下标中订阅。 我怎样才能实现它?

1 个答案:

答案 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