gpt4 book ai didi

angular - 某些事件未触发更改检测

转载 作者:行者123 更新时间:2023-12-05 01:19:09 25 4
gpt4 key购买 nike

我有一个组件订阅来自服务Observable。当 observable 发出其 next 值时,我的组件中发生了一些变化。奇怪的是,组件是否会更新 View 取决于 next 值的生成方式。如果我理解正确的话,一些事件已经被 angular 2 猴子修补以触发变化检测,而有些则没有。 MIDI 事件是其中之一(这有点道理)。

如果服务查找点击事件以触发下一个值,则更改会反射(reflect)在 View 中。因此发生变化检测。

如果服务查找键盘事件,则发生变化检测。

但是,当服务使用 MIDI 事件时,不会发生变化检测。

这里是一些代码:

export class App {

arr = [
{id: 1, status: false},
{id: 2, status: false},
{id: 3, status: false}
];

thing = new Subject<boolean>();

constructor(private renderer: Renderer,
private ser:Ser,
private midi: MidiService) {}

ngOnInit(){
// listening to click events, will trigger change detection
this.renderer.listenGlobal('document', 'click', (event) => {
console.log("Left click", event);
this.thing.next(1);
});
this.thing.subscribe( v => this.toggle(v));
// my midi service events will call the toggle method however the
// changes won't be displayed in the view
this.midi.notesPayed$.subscribe(v => this.toggle(v));
}

这是一个 plnkr :

https://plnkr.co/edit/SS6jwgQg4TVdOCC05cNV?p=preview

我不确定这是 angular 2 底层工作原理的错误还是功能。无论如何,我想知道为什么会发生这种情况。具体问题很容易通过自己调用更改检测来解决,因此我不需要解决方案。

最佳答案

这是已知行为。 MIDI API 未包含在 zone.js 中,因此 Angulare 不会收到运行变化检测的通知。

注入(inject) zone:NgZone 并用 this.zone.run(() => {...}) 包装更改模型的代码

或注入(inject) cdRef:ChangeDetectorRef 并在更改后通过调用 this.cdRef.detectChanges() 调用更改检测

关于angular - 某些事件未触发更改检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41228368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com