0

私はこれについて合理的な説明があると確信していますが、なぜオブジェクトのプロパティはビューで更新されますが、プリミティブ型である変数はそうではないのかはわかりません。私はngrx/storeのobservablesを使用しているので、それが理由である可能性がありますが、私は他の非同期の状況でこれを見たように感じていますので、私はそれを理解しようとしています。角2の変更検出が.Subscribe()コールバックのプリミティブで機能しない?

例えば、私は、このテンプレートを持っている:私はスクリーンで表すテキストを検索する場合

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

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

は、コンポーネントのための私の活字体クラスで私はこのような何かを持っていますdataCounter変数は更新されませんが、data.counterを表すテキストは更新されます。 zone.jsを強制的に実行させる余分なブロックさえも役に立ちません。 dataCounterは元のテキストを表示します(注:実際に何が起きるかは、dataCounterが初期状態の値を取得したものですが、後でsubscribeが呼び出されると更新されません。誰かがこれを説明できますか?あなたはハンドラが

data.counterCHANGE_STUFFあなたmainStoreReducerあなたがこれを変異させるの内側にあるため、更新取得されたイベントのディスパッチ後に実行されていないサブスクライブお気づきのように https://plnkr.co/edit/gEeAKK31Yo6kATjFQY08?p=templates

+1

問題を再現する完全な最小限の例をレデューサーのマニュアルを参照してください。 –

+0

plunkerを提供してください – yurzui

+0

投稿の最後にplunkを追加しましたが、plunkrに@ ngrx/storeを追加する方法がわかりません。 :/ – Jim

答えて

3

:ここ

は、私が説明してる状況のplunkrです新しいオブジェクトを作成する代わりにオブジェクトを作成します。ここで

はあなたが間違っていた場所である:

let newState = Object.assign(state); 

それは次のようになります。

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

か良い方法:

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

Plunker Example

より良く理解するため

はポストに

関連する問題