2016-11-22 4 views
0

Angular2(NgRedux)内のReduxを使用して注文エントリを更新/設定します。プロキシ変数を変更してから、object.assign状態に変更してもよろしいですか?私のデータリデューサでRedux:これは変異状態としてカウントされますか?

case DataActions.UPDATE_ORDER: 
    var updatedItem 
    var updatedState = state.orders 
    for(var i = 0; i < state.orders.length; ++i) { 
    if(state.orders[i]['key'] === action.payload.key) { 
     updatedItem = state.orders[i] 
     updatedItem.name = action.payload.name 
     updatedItem.items = action.payload.items 
    } 
    } 
    updatedState[i] = updatedItem 
    return Object.assign({}, state, { 
    orders: updatedState 
    }) 
+0

、およびそれらを変異する前に、私のオブジェクト/配列をコピーします。これが働きました。これがコピーであることを確認するには、varsの前に '_'を付けます。そのため、割り当てには左側にアンダースコア(var)が必要です(flatcopyのreadmeも参照してください)。 – Aitch

答えて

3

あなたの「代理変数は、」同じオブジェクトへの単なる別の参照ですので、はい、あなたは直接その配列内の項目を変異あります。

不変の更新を正しく行うために、ネストの各レベルをコピーする必要があります。 Reduxのドキュメントには、よくある間違いの例と、これを正しく行う方法の例が、http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.htmlにあります。

+0

はい!あなたの親切な先生に感謝。私は何かを感じた。 –

0

@markeriksonに感謝します。

ドキュメントのアドバイスを受けて、dotPropライブラリを使用しました。私はすべての私の減速のために(私のパッケージ)[flatcopy](https://www.npmjs.com/package/flatcopy)使用してい

npm install dot-prop-immutable 
... 
var dotProp = require('dot-prop-immutable'); 
... 
case DataActions.UPDATE_ORDER: 
    for(var i = 0; i < state.orders.length; ++i) { 
    if(state.orders[i]['key'] === action.payload.key) { 
     state = dotProp.set(state, `orders.${i}.name`, action.payload.name) 
     state = dotProp.set(state, `orders.${i}.items`, action.payload.items) 
    } 
    } 
    return state 
関連する問題