0

これには合理的な説明があると確信していますが、なぜオブジェクトのプロパティがビューで更新されるのに、プリミティブ型の変数は更新されないのか、本当に困惑しています。ngrx/store のオブザーバブルを使用しているため、それが原因である可能性がありますが、他の非同期の状況でこれを見たような気がするので、理解しようとしています。

たとえば、次のテンプレートがあります。

 <h1>{{data.counter}}</h1>
 <h1>{{dataCounter}}</h1>

次に、コンポーネントの TypeScript クラスには、次のようなものがあります。

ngOnInit() {
  this.store.select('mainStoreReducer')
    .subscribe((data: MyState) => {
      this.zone.run(() => {
      this.dataCounter = data.counter;
      this.data = data;
    });
}

画面を見ると、dataCounter 変数を表すテキストは更新されていませんが、data.counter を表すテキストは更新されています。zone.js を強制的に実行するための追加のブロックでさえ、役に立ちません。dataCounter は引き続き元のテキストを表示します (注意: 実際には、dataCounter は初期状態の値を取得しますが、後でサブスクライブが開始されたときに値が更新されることはありません。data.counter のテキストは常に更新されます)。誰かがこれを説明できますか?

ここに、私が説明している状況の plunkr があります: https://plnkr.co/edit/gEeAKK31Yo6kATjFQY08?p=templates

4

1 に答える 1

3

お気づきのように、イベントのディスパッチ後にサブスクライブ ハンドラが実行されていません。CHANGE_STUFF

data.countermainStoreReducer新しいオブジェクトを作成するのではなく、内部でこのオブジェクトを変更するため、更新されています。

ここであなたが間違っていた場所です:

let newState = Object.assign(state);

そのはず:

let newState = Object.assign({}, state);

またはより良い方法:

let newState = Object.assign({}, state, { counter: 13 });

プランカーの例

理解を深めるには、レデューサーのドキュメントを参照してください

于 2016-12-10T18:50:16.300 に答える