仅在特定属性发生变化时才订阅观察

时间:2016-08-18 12:19:51

标签: javascript angularjs rxjs

我需要将rxjs的subscribe方法限制为某些属性更改。我尝试用distinctUntilChanged来做,但我想我错过了一些东西。

当属性data.members[]发生变化时,我只想订阅火。

this.myService.loadData(this.data.id)
  .distinctUntilChanged()
  .subscribe(data => {
    this.data = data;
    console.log("data changed", data);
});

我如何应对不同的变化?

2 个答案:

答案 0 :(得分:0)

查看documentation (Rxjs v4),我发现您应该能够使用Rx.Observable.prototype.distinctUntilChanged([keySelector], [comparer])实现所需目标,并使用keySelector选择要检测其更改的属性和comparer参数来检测相等性。

Rxjs v5的distinctUntilKeyChangeddistinctUntilChanged具有相似的功能。

您可以查看测试用例:[https://github.com/ReactiveX/rxjs/blob/master/spec/operators/distinctUntilChanged-spec.tshttps://github.com/ReactiveX/rxjs/blob/master/spec/operators/distinctUntilKeyChanged-spec.ts]

我猜你应该能够设置一些内容,如果没有,请回复你所尝试的内容。

答案 1 :(得分:0)

  

.distinctUntilChanged((data) => { return data.members; })有效!我怎么能检查多个阵列? (成员,关系,孩子)?

     

我想对数组中的更改做出反应(添加/删除项目)。

使用angular.equals进行深度比较。

this.myService.loadData(this.data.id)
  .distinctUntilChanged((data) => (data.members), (a,b) => (angular.equals(a,b))
  .subscribe(data => {
    this.data = data;
    console.log("data changed", data);
});

有关distinctUntilChanged的详细信息,请参阅RxJS distinctUntilChanged API Reference

有关angular.equals的详细信息,请参阅AngularJS angular.equals API Reference