2015-05-14 74 views
0

我试图操纵通过添加和插入到列表中的条目不可变的(3.6.4)光标:Immutable.js通过操纵光标插入元素

var data = Immutable.fromJS({a: {b: [0, 1, 2]}}); 
var cursor = Cursor.from(data, ['a', 'b'], function(newData){ 
    data = newData; 
}); 

cursor = cursor.push(3); 
var newList = cursor.splice(1,0,11); 
cursor.update(function(x){return newList;}); 

console.log(data.toJS().a.b); //Result [0, 11, 1, 2, 3] 

为什么是它的cursor.splice没有更新'数据'?

现在,使用withMutation,splice似乎不起作用。我在日志语句旁边添加了结果。

var data = Immutable.fromJS({a: {b: [0, 1, 2]}}); 
var cursor = Cursor.from(data, ['a', 'b'], function(newData){ 
    console.log("Setting Data"); 
    data = newData; 
}); 

cursor.withMutations(function(c){ 
    console.log(c.toJS()); //[0, 1, 2] 
    c.push(3).toJS(); 
    console.log(c.toJS()); //[0, 1, 2, 3] 
    var newList = c.splice(1,0,11); 
    console.log(newList.toJS()); //[11] 
    console.log(c.toJS());//[] 
    c.update(function(x){return newList;});  
}); 

什么是实现这一目标的正确方法?从李拜伦github issue

+0

https://github.com/facebook/immutable-js/issues/479 – user1573593

回答

0

响应:

splice()的操作类似于map()filter() - 它不能一个withMutations内使用,也不能用于更新光标。

正确的方式在一个阵列中插入使用游标时是指引用元素:

// instead of 
parentCursor.get('mylist').splice(...); 
// do: 
parentCursor.update('mylist', list => list.splice(...)); 

即相同的模式也适用于其他种类的地图/过滤操作的正常工作。