∮问题是
我有一个订阅Observable的组件,只有当我将鼠标移到浏览器窗口上时,myValue
的值才会在模板中更新。
最奇怪的是两个console.log
工作正常。
- 我重新加载页面,保持鼠标静止
- 我可以在控制台中看到更新后的值
- 模板仍显示"defaultValue"值
- 我移动鼠标,模板显示我已经在控制台中看到的更新值。
我设法使它与ChangeDetectorRef
和.detectChanges()
一起工作,但当您不知道问题在哪里时,它似乎与在AngularJS中使用$scope.apply()
一样错误。
我的组件.组件. ts
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { Subscription } from 'rxjs/Subscription';
import { HelperService } from 'path';
@Component({
selector: 'my-selector',
templateUrl: 'my-component.component.html'
})
export class MyComponent implements OnDestroy, OnInit {
myValue: string;
private subscription: Subscription;
constructor(
private helperService: HelperService
) {
//
}
ngOnInit() {
this.myValue = 'defaultValue';
this.subscription = this.helperService.getNewValue$().subscribe((newValue) => {
console.log('pre', this.myValue);
this.myValue = newValue;
console.log('post', this.myValue);
});
}
ngOnDestroy() {
if (this.subscription !== undefined ) {
this.subscription.unsubscribe();
}
}
}
助手.服务. ts
getNewValue$(): Observable<string> {
return Observable.fromPromise(this.methodCallingAThirdPartyLibrary());
}
我的组件.组件. html
debug: {{ myValue }}
3条答案
按热度按时间8cdiaqws1#
这里有一个有趣的观点:https://stackoverflow.com/a/41241646/1030207
this.methodCallingAThirdPartyLibrary()
正在返回调用第三方库的方法所返回的Promise,因此可能一切都发生在Angular的控制之外。明天早上(这里是23:44),我将尝试将内部调用打包到
zone.run
中dz6r00yl2#
由于我无法实现您的服务,我已经完成了以下代码,以使用ngDoCheck和ChangeDetectionStrategy记录组件发生的任何更改,如下所示
我使用了一个文本框来检测组件中的更改。
**一个
t98cgbkg3#
你应该改变你的组件的检测策略。我有一个类似的案例,解决我的问题是把add changeDetection变量设置为Default而不是OnPush。如下所示。