2015-12-15 5 views
0

Я использую immutable.js функцию update() и updateIn(). Но результат не получается так, как ожидалось.Функция неизменного обновления не работает

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()); 

Я попробовал это в jsfiddle. Но в initialState изменений нет.

Спасибо заранее.

ответ

0

Вы указали initialStateconst, что означает, что вы не можете изменить значение, удерживаемое этой переменной (это переменная, несмотря на то, что она не может быть изменена). Таким образом,

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

не обновляет значение в initialState.

Если вы хотите, то изменить const на var или let.

Что касается productList: Обратите внимание, что Array#mapвозвращает новый массив, он не изменяет существующий массив. Таким образом, вы, возможно, хотели:

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

Вы, наверное, знаете это, но я просто помечать его в любом случае: const это новая функция JavaScript от ES2015 (ES6). Он поддерживается в современных двигателях, таких как V8 (в Chrome и NodeJS), но у большого числа браузеров его еще нет (либо потому, что их еще нет, либо потому, что люди используют более старые версии, которые были выпущены до того, как спецификация была завершена.) Если вы не сделали , значит, чтобы использовать функции ES2015, вам нужно будет var, а не let (так как let также является новым).

+0

Даже если вы измените 'initialState' на var или let, productList будет не определен после функции map. Можете ли вы мне помочь? –

+0

@AmalaJames: Это поможет, если код будет отформатирован/отформатирован разумным, последовательным образом. Вы можете использовать все, что захотите, в своем собственном коде, но при обращении за помощью полезно сделать код читаемым для других. –

+0

@AmalaJames: Я обновил ответ. Вы не используете возвращаемое значение 'map'. –

Смежные вопросы