Knockout.js 敲除映射到JS错误?空数组项

Knockout.js 敲除映射到JS错误?空数组项,knockout.js,knockout-mapping-plugin,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'}]}; 然后,我

使用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之后,我发现第三个数组项是一个空对象。 我不确定这是一个错误还是我错过了什么。我注意到的另一件事是,它只在我第一次更新数据时发生。如果我使用initData更新视图模型,然后再次使用newData,则结果是正确的

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

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

alert('JSON is ' + ko.mapping.toJSON(self.data));
也许ko.mapping.toJSON没有正确地注册为依赖,或者它采用了一些快捷方式,不打算在计算环境中使用

编辑

使用节流扩展器强制在所有更改完成后进行计算,可以解决此问题


最好是在数据对象正确时立即报告此错误,并且ko.mapping.toJS返回正确的JSON,我认为唯一的问题是ko.mapping.toJS没有导致计算触发gui更改。我在IE 9中也遇到过一个问题,敲除映射填充集合中的空项。这种错误只是偶尔发生,这使得诊断起来很困难。我有一个4项JSON数组,只填充了第一项和最后一项[[object],[object]]。奇怪吧?谢谢你的回答,杰森。虽然你的解决方案似乎不适合我实际项目中的情况。请看我编辑的问题。这很奇怪,当我在更改后立即在答案中添加警告时,我得到了正确的JSON。我发现的唯一问题是计算机没有立即启动导致html更新,toJSON返回了正确的答案。
    this.json = ko.computed(function() {
        return JSON.stringify(ko.mapping.toJS(self.data, mapping));
    }).extend({ throttle: 1 });