2

からsubscribesへのコンポーネントがあります。がその値を発行すると、コンポーネントで何らかの変更が発生します。奇妙なことに、値がどのように生成されたかに応じて、コンポーネントがビューを更新する場合としない場合があります。私がこれを正しく理解している場合、いくつかのイベントは、変更検出をトリガーするためにangular 2によってモンキーパッチが適用されており、一部のイベントはそうではありません。MIDI イベントは、そうでないイベントの 1 つです (これはちょっと意味があります)。Observableserviceobservablenextnext

サービスが次の値をトリガーするためにクリック イベントを探す場合、変更がビューに反映されます。そのため、変更検出が行われます。

サービスがキーボード イベントを同じように検索すると、変更検出が行われます。

ただし、サービスが 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 の基礎となる機能の機能なのかはわかりません。いずれにせよ、なぜこれが起こるのか知りたいです。具体的な問題は、変更検出を自分で呼び出すことで簡単に解決できるため、解決策は必要ありません。

4

1 に答える 1

6

それは既知の動作です。MIDI API は zone.js でカバーされていないため、Angulare は変更検出を実行するように通知されません。

zone:NgZoneモデルを変更するコードを挿入してラップするかthis.zone.run(() => {...})

または呼び出して、変更後に変更検出を挿入cdRef:ChangeDetectorRefして呼び出しますthis.cdRef.detectChanges()

于 2016-12-19T19:01:31.437 に答える