Immutable.js通过游标操作插入一个元素

时间:2015-05-14 09:45:53

标签: cursor immutable.js

我试图通过在列表中添加和插入条目来操纵不可变(3.6.4)游标:

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没有更新'data'?

现在,使用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;});     
});

获得此权利的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

Lee Byron的回复github issue

var inobj = document.getElementById("idd"); 的运作方式与splice()map()类似 - 它不能在filter()内使用,也不能用于更新游标。

使用游标时在数组中插入的正确方法是引用引用元素:

withMutations

同样的模式也适用于其他类型的地图/过滤操作。