我有一个订阅Observable的组件。只有在我将鼠标移到浏览器窗口之后,才会在模板中更新myValue
的值。
最奇怪的是两个console.log
工作正常。
我设法让它与ChangeDetectorRef
和.detectChanges()
一起使用,但是当您不知道AngularJS中的$scope.apply()
时,它似乎是错误的问题
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();
}
}
}
getNewValue$(): Observable<string> {
return Observable.fromPromise(this.methodCallingAThirdPartyLibrary());
}
debug: {{ myValue }}
答案 0 :(得分:1)
这是一个有趣的观点:https://stackoverflow.com/a/41241646/1030207
this.methodCallingAThirdPartyLibrary()
返回通过调用第三方库的方法返回的Promise,所以可能一切都发生在Angular的控制之外。
明天早上(这里是23.44)我会尝试将内部呼叫包装成zone.run
答案 1 :(得分:0)
由于我无法实现您的服务,我在下面的代码中进行了记录,以便在使用ngDoCheck和ChangeDetectionStrategy进行组件更改时进行记录,如下所示
import {Component, NgModule ,ChangeDetectionStrategy,ngDoCheck} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser'
import {FormsModule} from '@angular/forms';
@Component({
selector: 'my-app',
template: `
<div>
<h2>Hello {{name}}</h2>
<input [(ngModel)]="someValue" />
</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class App implements ngDoCheck {
someValue:any;
name:string;
constructor() {
this.name = 'Welcome to Change Detection Demo'
}
ngDoCheck(){
console.log(this.someValue);
}
}
我使用了一个文本框来检测组件中的更改。
<强> LIVE DEMO 强>