2017-10-18 41 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