2015-12-15 1 views
0

J'utilise immutable.js function update() et updateIn(). Mais le résultat ne se passe pas comme prévu.La fonction de mise à jour non modifiable ne fonctionne pas

const initialState = Immutable.fromJS({cartList: [ 
     { 
      id: 1, 
      name: "Product One", 
      quantity:1 
     },{ 
      id: 2, 
      name: "Product Two", 
      quantity:2 
     }], 
    productList:[{ 
      name: "Product One", 
      id: 1, 
      availability:2 
     },{ 
      name: "Product Two", 
      id: 2, 
      availability:2 
     },{ 
      name: "Product Three", 
      id: 3, 
      availability:4 
     }]}); 
var action = { 
      id: 2, 
      name: "Product Two", 
      quantity:2 
     }; 

initialState = initialState.updateIn(['cartList'], cartList => cartList.push(action)).toJS(); 
initialState = initialState.updateIn(['productList'], productList => { 
      productList.map(product => { 
        if(action.id == product.get("id")){ 
         return product.update("availability", value => value-1); 
       } else 
         return product 
      }); 
}).toJS(); 

console.log(initialState.toJS()); 

Je l'ai essayé dans jsfiddle. Mais il n'y a pas de changement dans initialState.

Merci à l'avance.

Répondre

0

Vous avez déclaré initialStateconst, ce qui signifie que vous ne pouvez pas modifier la valeur détenue par cette variable (c'est une variable, bien qu'elle ne puisse pas être modifiée). Alors

initialState = initialState.updateIn(/*...*/); 

mettra pas à jour la valeur initialState.

Si vous le souhaitez, remplacez const par var ou let.

En ce qui concerne productList: Notez que Array#mapretours le nouveau tableau, il ne modifie pas le tableau existant. Donc, vous avez peut-être voulu:

productList = productList.map(/*...*/); 

Vous le savez probablement, mais je vais juste le signaler de toute façon: const est une nouvelle fonctionnalité de JavaScript au ES2015 (ES6). Il est pris en charge dans les moteurs récents comme V8 (dans Chrome et NodeJS), mais un grand nombre de navigateurs ne l'ont pas encore (soit parce qu'ils ne l'ont pas encore, soit parce que les gens utilisent des versions plus anciennes ont été publiées avant la spécification a été finalisé.) Si vous n'avez pas signifie pour utiliser les fonctionnalités ES2015, vous aurez besoin var plutôt que let (comme let est également nouveau).

+0

Même si vous modifiez 'initialState' en var ou let, productList ne sera pas défini après la fonction map. Pouvez-vous m'aider?? –

+0

@AmalaJames: Il serait utile que le code soit indenté/formaté d'une manière raisonnable et cohérente. Vous pouvez utiliser tout ce que vous voulez dans votre propre code, mais lorsque vous demandez de l'aide, il est utile de rendre le code lisible par les autres. –

+0

@AmalaJames: J'ai mis à jour la réponse, cependant. Vous n'utilisez pas la valeur de retour de 'map'. –