2016-12-27 59 views
3

所以我有兩個observable,一個返回當前類別和其他產品。我希望根據類別過濾產品。如何使用observable的輸出來過濾另一個

這是角2,所以我真的希望我的NG2視圖是用戶(通過異步管道)。

像這樣簡單的例子:

let category$ = Observable.of({id: 1}); 
let products$ = Observable.from([{name: 'will be included', cat_ids: [1, 5]}, {name: 'nope', cat_ids: [2, 3]}, {name: 'also yep', cat_ids: [1, 7]}]); 

return products$ 
    .toArray() 
    .filter(prod => { 
    return prod.cat_id.some(id => id === <how do I get the value of the category observable here?>) 
    }); 

也許答案很簡單,但它躲開我。

回答

5

您需要加入這兩個流,例如與combineLatest

let category$ = Observable.of({id: 1}); 
let products$ = Observable.from([{name: 'will be included', cat_ids: [1, 5]}, {name: 'nope', cat_ids: [2, 3]}, {name: 'also yep', cat_ids: [1, 7]}]); 

return Observable.combineLatest(products$, category$) 
    .map(([products, category]) => { 
    return products.filter(prod => prod.cat_id.some(id => id === category.id); 
    }); 

更新

由於@olsn指出了Observable.from你得到的事件流不流事件的數組。因此,解決方案應該是:

let category$ = Observable.of({id: 1}); 
let products$ = Observable.from([{name: 'will be included', cat_ids: [1, 5]}, {name: 'nope', cat_ids: [2, 3]}, {name: 'also yep', cat_ids: [1, 7]}]); 

return Observable.combineLatest(products$, category$) 
    .filter(([product, category]) => { 
    return product.cat_id.some(id => id === category.id); 
    }) 
    .map(([product, category]) => product); 
+0

這樣做的伎倆。 – DarkNeuron

+1

爲了防止有人遇到這個解決方案:'產品$'使用'Observable.from' - >所以'產品'將__not__是一個數組,但是一個對象,所以它的代碼將會失敗, products.filter不是一個函數' – olsn

+0

Observable.from在rxjs中接受一個數組5.所以,代碼將工作,我想。 – DarkNeuron

相關問題