DOM 未使用 Angular 5 的 EventListener 进行更新
DOM is not updated with EventListener using Angular 5
上下文:我正在使用 Angular PWA 通过 WKWebview 与 iOS 本机应用程序通信。我正在使用 messageHandlers 来在打字稿文件和 Swift 逻辑代码之间共享数据。
问题:我正在使用 addEventListener 来侦听 window 对象上的特定事件。在我的组件中,我订阅了一个可观察对象来监听变化。但是我的组件没有在 subscribe 方法中应用变量更改。
myService.ts
public myValue$ = new Subject<number>();
window.addEventListener('didDeviceDisconnected', (e) => {
...
this.dispatchInfo(someInfo);
});
private dispatchInfo(value: number) {
this.myValue$.next(value);
}
public getValue(): Observable<number> {
return this.myValue$.asObservable();
}
myComponent.ts
// Wait for the notification
this.myValueSubscription = this.myService.getValue().subscribe(value => {
this.myValue = value;
alert("myValue : " + this.myValue);
})
myComponent.html
{{ myValue }}
警报正确显示该值,但 DOM 显示该值未定义。我还尝试在订阅函数中添加 setTimeout 但没有成功。如何应用订阅方法的更改?它在 angular 范围之外吗?
是的,它在 angular 范围之外。
你可以试试这个..
myComponent.ts
import { Component , NgZone } from '@angular/core';
......
constructor(public ngZone: NgZone)
......
this.myValueSubscription = this.myService.getValue().subscribe(value => {
this.ngZone.run(()=> {
this.myValue = value;
});
})
我使用提供更改检测功能的 ChangeDetectorRef 解决了这个问题。
import { Component, ChangeDetectorRef } from '@angular/core';
constructor(.., private cdr: ChangeDetectorRef){}
this.myValueSubscription = this.myService.getValue().subscribe(value => {
this.myValue = value;
alert("myValue : " + this.myValue);
this.cdr.detectChanges(); // <= ADDED
})
上下文:我正在使用 Angular PWA 通过 WKWebview 与 iOS 本机应用程序通信。我正在使用 messageHandlers 来在打字稿文件和 Swift 逻辑代码之间共享数据。
问题:我正在使用 addEventListener 来侦听 window 对象上的特定事件。在我的组件中,我订阅了一个可观察对象来监听变化。但是我的组件没有在 subscribe 方法中应用变量更改。
myService.ts
public myValue$ = new Subject<number>();
window.addEventListener('didDeviceDisconnected', (e) => {
...
this.dispatchInfo(someInfo);
});
private dispatchInfo(value: number) {
this.myValue$.next(value);
}
public getValue(): Observable<number> {
return this.myValue$.asObservable();
}
myComponent.ts
// Wait for the notification
this.myValueSubscription = this.myService.getValue().subscribe(value => {
this.myValue = value;
alert("myValue : " + this.myValue);
})
myComponent.html
{{ myValue }}
警报正确显示该值,但 DOM 显示该值未定义。我还尝试在订阅函数中添加 setTimeout 但没有成功。如何应用订阅方法的更改?它在 angular 范围之外吗?
是的,它在 angular 范围之外。
你可以试试这个..
myComponent.ts
import { Component , NgZone } from '@angular/core';
......
constructor(public ngZone: NgZone)
......
this.myValueSubscription = this.myService.getValue().subscribe(value => {
this.ngZone.run(()=> {
this.myValue = value;
});
})
我使用提供更改检测功能的 ChangeDetectorRef 解决了这个问题。
import { Component, ChangeDetectorRef } from '@angular/core';
constructor(.., private cdr: ChangeDetectorRef){}
this.myValueSubscription = this.myService.getValue().subscribe(value => {
this.myValue = value;
alert("myValue : " + this.myValue);
this.cdr.detectChanges(); // <= ADDED
})