2017-10-18 60 views
0

我使用angular 4工作,並且發現了Observable概念...讓Oservable獲得項目

我有此對象。

myobjects: Observable<MyObject[]>; 

我想找到我的object.name == 'titi'例如和return MyObject,而不是Observable的屬性名稱的對象......

let toto: MyObject; 
toto = this.myobjects.filter((tb: MyObject[], i: number) => { 
       return tb[i].name=== "titi"; 
      }). 
      subscribe((tbs: MyObject[]) => { 
       toto = tbs; 
      }); 

這可能嗎? 我沒有找到.. 我不明白:(

+0

您可以在訂閱方法中進行過濾 – learner

回答

3

當流處理,你應該避免副作用,如果可能的話。而不是將其重新分配給一個類變量,你倒是應該擁抱可觀察的模式,這樣做:

const selectedPers$ = this.personArray$ 
    .map(arr => arr.find(pers => pers.name === 'titi')) 
    .filter(pers => !!pers); 

,然後在視圖中使用異步管這樣的:

<p>The selected person is {{ selectedPers$ | async | json }}</p> 

如果你想顯示,例如,你可能做的名字和人的年齡:

<div *ngIf="selectedPers$ | async as selectedPers"> 
    <p>Person's name is: {{ selectedPers.name }}</p> 
    <p>Person's age is: {{ selectedPers.age }}</p> 
</div> 

這樣,每次你personArray$發出一個新的值時,所選擇的個人將被更新。

+0

在你的情況selectedPers $是一個可觀察的而不是一個人似乎對我 – lg0173

+0

這是整點。 – Maxime

+0

我知道你的問題是關於「如何將它提取到一個變量」,但我建議你在發現可觀察事物時採用反應式編程「我發現可觀察的概念」。越不可變,功能性和被動性,最容易的就是調試和創建新事物(一旦你瞭解了observables的工作方式)。 – Maxime

1

所有什麼ü需要做的就是在這個Observable訂閱頻道,讓那麼濾鏡陣列的陣列來獲取ü要然後把它的值。在你的對象值

這裏是一個簡單的解決方案:

myobjects: Observable<MyObject[]>; 
let toto: MyObject; 
this.myobjects.subscribe(result => 
     let newArray = result.filter(object => object.name === 'titi'); 
     if(newArray.length === 1) 
     this.toto = newArray[0]; 
); 

希望它可以幫助你:)

+0

謝謝ali它的工作 – lg0173

+0

它的工作原理,但它不是最好的方式來做到這一點。另外,請注意,您必須將訂閱保存到類變量中,並在'ngOnDestroy'上調用取消訂閱以避免內存泄漏。我並不是說你不應該那樣做,但是對於這個用例,你應該看看我的答案,它會在異步管道銷燬組件時自動取消訂閱。 – Maxime

+0

如果你想這樣,你應該看看這個[問題](https://stackoverflow.com/questions/46801402/angular-4-best-way-of-unsubscribeing/46805001#46805001) – Maxime