2017-07-26 66 views
0

我想在屏幕上顯示IMessage的列表,並且能夠使用Pipe對它們進行過濾。 該消息實際上是一個Observable<IMessage[]>,我想通過檢查它的isPrivate屬性來過濾每個IMessage。 的MessageStatusPipe的代碼如下所示:Angular 2過濾一個Observationbble <object[]>

export class MessageStatusPipe { 
    transform(message: Observable<IMessage[]>, privateFilter: bool) { 


     //Here I want to return the Messages which the pass the privateFilter, but how? 

    } 
} 

我看過一些問題,這似乎非常相似,但我似乎不能夠應用該解決方案。 由Luka Jacobowitz提供的以下解決方案似乎正是我需要的。 https://stackoverflow.com/questions/37991713/simple-filter-on-array-of-rxjs-observable#=

============更新與答案=============

正如梅爾指出,管返回一個布爾值,而不是包含與過濾器匹配的項目的子數組。我的工作管現在看起來是這樣的:

export class MessageStatusPipe { 
    transform(messages: Observable<IMessage[]>, privateFilter: bool) { 
     return messages.map(m => m.filter((message, i) => { 
      return message.isPrivate == privateFilter; 
     })); 
    } 
} 

回答

0

你的行動可以(應該)被分成兩個部分: 1.獲取異步值 2.過濾他們

所以,你可以改變你管的簽名:

transform(messages: IMessage[], privateFilter: bool) { ... } 

而在你的組件做:

<div *ngFor="let msg of messages | async | messageStatusPipe">...</div> 

如果由於某種原因想要將它們組合成一個管道,可以查看article I wrote,其中顯示瞭如何處理管道內的異步值並使其適應您的需求(主要是添加您的過濾日誌)

============添加過濾邏輯==============

return messages.filter(privateFilter); 
+0

''

...
這 其實是我已經在我的組件。 'transform(messages:IMessage [],privateFilter:bool){...}' 這就是我的管道過去看起來像,但給了一個'Observable ',我不能應用過濾器。 – Bunnynut

+1

你的管道不應該返回一個布爾,它應該返回符合條件的子數組 – Meir

+0

你是對的,我用一個工作解決方案更新了我的答案。 – Bunnynut