RxJS可观察对象属性

时间:2018-03-21 16:47:08

标签: angular typescript rxjs

我想用RxJS观察属性的变化。

~

我有一个主题,新创建的对象被推入其中。有几个组件订阅了这些组件,应该对不同的属性更改做出反应。

在上面的示例中,如果设置了interface Test { required: boolean; toObserve: boolean; } class TestClass { @Input() subject: Subject<Test>; registerHandlers() { this.subject.filter(element => element.required).subscribe(next => // Observe a property of every element that was registered Observable.of(next.toObserve).subscribe(val => { if (val) { // DO SOMETHING } else { // DO SOMETHING ELSE } }) ); } } ,我希望组件执行某些操作。这当前只运行一次 - 根据元素在toObserve注册时的值,执行正确的路径。

但是,只要我更改subject.next(element)的值,就不会发生任何事情,订阅似乎也不再有效。

2 个答案:

答案 0 :(得分:1)

不建议订阅订阅。我宁愿为你的主题创建一个运营商链并订阅它:

如果要根据流中的特定属性在组件中执行某些副作用,可以使用do运算符:

interface Test {
  required: boolean;
  toObserve: boolean;
}

class TestClass implements OnInit {
  @Input() subject: Subject<Test>;

  ngOnInit() {
    this.registerHandlers().subscribe();
  }

  registerHandlers() {
    return this.subject
     .filter(element => element.required)
     .do(next => {
        if (next.toObserve) {
          // DO SOMETHING
        } else {
          // DO SOMETHING ELSE
        }
     });    
  }
}

答案 1 :(得分:0)

很抱歉,但我认为您并不完全了解如何正确完成订阅。

你有你的主题

@Input() subject: Subject<Test>;

并且您希望在主题发生变化时触发操作。然后将此订阅放入ngOnInit() - 方法:

this.subject.subscribe(value => {
   // and here goes your evaluation
   if(value.toObserve) {
      // do something
   } else {
      // do something else
   }
});

你可以更进一步做这样的事情

this.subject.subscribe(value => {
   // and here goes your evaluation
   if(value.toObserve) {
      // do something
   } else {
      // do something else
   }

   if(value.required) {
      // do something
   } else {
      // do something else
   }
});