为什么RxJS或Angular Observable订阅方法需要上下文?

时间:2017-12-29 06:41:09

标签: javascript angular rxjs

考虑以下场景,我将使用对RxJs Observable的订阅向子组件传递属性。

当不发送匿名函数或隐藏此上下文时,Angular未检测到更改。

// Scenario 1
// Child component IS updated properly
this.someService.someObservable.subscribe((data) => {
    this.doSomething(data);
})

// Scenario 2
// Child component IS updated properly
this.someService.someObservable.subscribe(this.doSomething.bind(this))

// Scenario 3
// Child component is NOT updated properly
this.someService.someObservable.subscribe(this.doSomething)


private doSomething(data) {
    // this is executed on all the scenarios
    this.fieldPassedToChildComponent = data;
}

为什么我们需要绑定angular的上下文来获取更改?

1 个答案:

答案 0 :(得分:2)

第三种情况的问题:

// Scenario 3
// Child component is NOT updated properly
this.someService.someObservable.subscribe(this.doSomething)

您无法确定此行this函数中doSomething个关键字包含的内容:this.fieldPassedToChildComponent = data;。这取决于subscribe方法如何调用您的回调。

如果您查看subscribe的源代码,您可以找到如何调用回调方法,以及this设置的内容。我的猜测是undefined。但可能是任何事情。所以不要这样使用。