2017-01-09 3 views
0

Я пытаюсь установить значение неизменяемого объекта, используя .set(). Значение обновляется по мере необходимости, но я не могу извлечь из объекта, используя .getIn(). Я думаю, это происходит потому, что он не является глубоким, чтобы дети объекта были неизменными. Есть ли какой-либо метод в immutable.js, который позволит мне это сделать? Я знаю, что могу обернуть объект в fromJS(), как .set(fromJS('rooms', roomMap)), но это кажется грязным. Каков правильный способ сделать это?ImmutableJS глубокая установка объекта

const state = Immutable.fromJS({ 
     rooms: false 
    }); 

    const roomMap = 
    { 
     "roomid1": { 
      "id": "roomid1", 
      "name": "Room 101", 
     }, 
     "roomid2": { 
      "id": "roomid2", 
      "name": "Room 102", 
     }, 
    }; 

    var newState = state.set('rooms', roomMap); 
    console.log(newState.getIn(['rooms', 'roomid1']));; 

https://jsfiddle.net/z0a4p199/1/

+1

Вот что 'функция fromJS' для хотя. Либо вы создаете каждую вложенную коллекцию, используя их соответствующие функции «Карта» или «Список», но это кажется необоснованным. – stinodes

ответ

0

вашей комнату карты является простым Javascript объекта, а не immutalblejs карты.

Следовательно, когда вы делаете state.set('rooms', roomMap), вы устанавливаете значение комнат на простой объект javascript.

newState.getIn(['rooms', 'roomid1']): это работает только в том случае, если newState полностью является объектом javascript.

Вы должны либо преобразовать комнату в карту immutablejs, либо получить доступ к roomid1 простым способом javascript.

Альтернатива 1:

roomMap = Immutable.fromJS(roomMap) 
state.update('rooms', (oldvalue)=>(roomMap)) 
newState.getIn(['rooms', 'roomid1']) 

Альтернатива 2:

newState.get('rooms').roomid1 

JS Filddle

0

Вы не можете использовать set с вложенными структурами, созданных fromJS.

Вам необходимо использовать либо mergeDeep, либо updateIn. В вашем случае, вы должны будете использовать mergeDeep

const state = Immutable.fromJS({ 
 
    rooms: false 
 
}); 
 
console.log(state.get('rooms')); 
 

 
const roomMap = { 
 
    "roomid1": { 
 
    "id": "roomid1", 
 
    "name": "Room 101", 
 
    }, 
 
    "roomid2": { 
 
    "id": "roomid2", 
 
    "name": "Room 102", 
 
    }, 
 
}; 
 

 
const newState = state.mergeDeep({ 
 
    rooms: roomMap 
 
}); 
 
console.log(newState.get('rooms'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>

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

  • Нет связанных вопросов^_^