我想用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)
的值,就不会发生任何事情,订阅似乎也不再有效。
答案 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
}
});