使用 knockoutjs 映射插件 2.11,我发现如果使用 ko.mapping.fromJS 更新视图模型(带有数组元素)并且新数组元素的长度比旧数组元素长,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 更新视图模型,结果是正确的。http://jsfiddle.net/gonglei/xgPSq/
编辑:感谢您的回答杰森。您的解决方案似乎不适合我在实际项目中的情况。我需要检索修改后的数据对象并将其发送到服务器。因此,当我调用 ko.mapping.toJS 时,我希望我能立即获得正确的数据对象,而不仅仅是在计算函数中显示 JSON 字符串。我在调用 ko.mapping.toJS 后立即设置了一个断点并观察数据对象,第三个元素确实是空的。我的服务器确实收到了这个空元素。油门扩展器确实让我得到了正确的对象,但它是异步方式。反正我是报bug了,看看开发者能不能确认一下或者给我解决办法。