2016-12-03 42 views
1

我試圖在角度+ NGRX應用使用此過濾器:過濾器陣列,用於angular2 + NGRX

fetchById(id: number): Document { 

return this.store.select(s => s.documents).filter(obj => obj.id == id)[0] 

} 

documentsDocuments陣列,並且後者有一個id屬性。這個想法是過濾數組以選擇一個文檔。但是,我收到此錯誤消息:

屬性id類型Document[]上不存在。我不明白這個消息,因爲obj是數組的一個元素,因此某個對象具有一個id屬性。關於這裏有什麼問題的任何想法?謝謝!

回答

2

讓我們打破運營明白這是怎麼回事...

fetchById(id: number): Observable<Document> { 
    const documents: Observable<Document[]> = this.store.select(s => s.documents); 
    const filtered: Observable<Document[]> = documents.filter((obj: Document[]) => obj.id == id); 
    const result: Observable<Document> = filtered.first(); 
    return result; 
} 

注意Observable#filter()的回調需要一個數組,而不是單個項目。這與Array#filter()和錯誤消息的原因不同。此外,請參閱我無法從[0]檢索第一個可觀察項的項目,請使用first()代替。然後我改變返回類型來返回一個可觀察值。

但是,它不起作用。當我們考慮從可觀察數據過濾數組時,可能我們想使用Observable#map()來生成另一個具有單個元素的數組。

fetchById(id: number): Observable<Document> { 
    return this.store 
    .select(s => s.documents) 
    .map(list => obj.find(obj => obj.id === id)); 
    .first(); 
} 

如果我們想返回觀察到的最後一個值,我們可以這樣做:

fetchById(id: number): Document | null { 
    let result: Document | null = null; 
    this.store 
    .select(s => s.documents) 
    .map(list => obj.find(obj => obj.id === id) || null); 
    .first() 
    .subscribe(item => result = item); 
    return result; 
} 

| null鍵入它因爲具有指定id文件可能不存在。