【问题标题】:knockout mapping toJS bug? empty array items淘汰映射到JS错误?空数组项
【发布时间】:2012-05-14 03:12:05
【问题描述】:

使用 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 更新视图模型,结果是正确的。 http://jsfiddle.net/gonglei/xgPSq/

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

【问题讨论】:

  • 最好的方法是在github.com/SteveSanderson/knockout.mapping报告这个错误
  • 数据对象立即正确并且 ko.mapping.toJS 返回正确的 JSON,我认为唯一的问题是 ko.mapping.toJS 不会导致计算触发 gui 更改。
  • 我在 IE 9 中也遇到了一个问题,即 Knockout 映射填充集合中的空项目。此错误仅有时会发生,因此难以诊断。我有一个 4 项 JSON 数组,它只填充第一个和最后一个项([[object Object],,,[object Object]])。很奇怪吧?

标签: knockout.js knockout-mapping-plugin


【解决方案1】:

第三项不是空对象。您可以通过列表绑定看到它具有值,即使您将其放在 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 });

【讨论】:

  • 感谢您的回答杰森。虽然您的解决方案似乎不适合我在实际项目中的情况。请参阅我编辑的问题。
  • 这很奇怪,当我在更改后立即将警报放入答案中时,我得到了正确的 JSON。我发现的唯一问题是计算没有立即触发导致 html 更新,toJSON always 返回了正确的答案。
猜你喜欢
  • 2015-07-16
  • 2012-10-10
  • 2012-10-14
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
相关资源
最近更新 更多