からsubscribes
へのコンポーネントがあります。がその値を発行すると、コンポーネントで何らかの変更が発生します。奇妙なことに、値がどのように生成されたかに応じて、コンポーネントがビューを更新する場合としない場合があります。私がこれを正しく理解している場合、いくつかのイベントは、変更検出をトリガーするためにangular 2によってモンキーパッチが適用されており、一部のイベントはそうではありません。MIDI イベントは、そうでないイベントの 1 つです (これはちょっと意味があります)。Observable
service
observable
next
next
サービスが次の値をトリガーするためにクリック イベントを探す場合、変更がビューに反映されます。そのため、変更検出が行われます。
サービスがキーボード イベントを同じように検索すると、変更検出が行われます。
ただし、サービスが 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 の基礎となる機能の機能なのかはわかりません。いずれにせよ、なぜこれが起こるのか知りたいです。具体的な問題は、変更検出を自分で呼び出すことで簡単に解決できるため、解決策は必要ありません。