淘汰映射到jS bug?空数组项

时间:2012-05-04 14:47:51

标签: knockout.js knockout-mapping-plugin

使用knockoutjs映射插件2.11,我发现如果使用ko.mapping.fromJS更新viewmodel(带有数组元素)并且新数组元素的长度比旧数据长,则ko.mapping.toJS生成空数组项。

我的初始数据映射是:

var initData = {text: 'Some Text', 
                arr: [{key: 1, value: 'a'}, 
                      {key: 2, value: 'b'}]};

然后我使用新对象更新了视图模型:

var newData = {text: 'Changed Text', 
                arr: [{key: 1, value: 'aa'}, 
                      {key: 12, value: 'bb'},
                      {key: 13, value: 'cc'}]};

之后我调用了ko.mapping.toJS(),我发现第3个数组项是一个空对象。 我不确定这是一个错误还是我错过了什么。我注意到的另一件事是,它只在我第一次更新数据时发生。如果我用initData更新视图模型然后再次更新newData,结果是正确的。 http://jsfiddle.net/gonglei/xgPSq/

编辑: 谢谢你的回答杰森。您的解决方案似乎不适合我的实际项目中的情况。我需要检索修改后的数据对象并将其发送到服务器。因此,当我调用ko.mapping.toJS时,我希望我能立即获得正确的数据对象,而不仅仅是在计算函数中显示JSON字符串。我在调用ko.mapping.toJS之后立即设置了一个断点,并观察数据对象,第三个元素确实是空的。我的服务器确实收到了这个空元素。节流扩展器确实让我得到了正确的对象,但它是异步的方式。无论如何,我把它报告为一个错误,看看开发人员是否可以确认它或给我一个解决方案。

1 个答案:

答案 0 :(得分:0)

第三项不是空对象。你可以通过列表绑定看到它有值,即使你把它放在你的change()函数的末尾,它也会返回正确的JSON:

alert('JSON is ' + ko.mapping.toJSON(self.data));

也许ko.mapping.toJSON()没有正确地将其自身注册为依赖,或者它需要一些快捷方式,并不打算在计算中使用?

修改

使用节流扩展器强制计算在所有更改完成后解决问题(jsfiddle

    this.json = ko.computed(function() {
        return JSON.stringify(ko.mapping.toJS(self.data, mapping));
    }).extend({ throttle: 1 });