4

我有一个淘汰的可观察数组,在网页加载时填充了一些初始值,并且我想在用户与页面交互时通过拼接方法添加到可观察数组中。我尝试添加到数组中的新项与数组中的原始项具有完全相同的属性,但是当我尝试将新项拼接到现有数组上时,我得到一个 Knockout 绑定错误,例如:“错误:无法解析绑定。消息:ReferenceError:未定义联系人名称;绑定值:文本:联系人名称“。即使有问题的属性确实存在于新数组中的所有项目上,也会发生此错误。我正在尝试在 Knockout 可观察数组上进行拼接,而不是在底层数组对象上进行拼接,因为我希望绑定自动更新。vmContacts.Contacts.splice(vmContacts.Contacts().length,0,contactData2);.

我在这里创建了一个小提琴示例,因此您可以看到它的实际效果:http: //jsfiddle.net/ak47/pMFwe/。单击“添加联系人”按钮时,您将在浏览器控制台中看到错误。

我想避免循环遍历新对象数组来为我需要添加的每个项目执行 push(),这就是拼接应该起作用的地方,但事实并非如此。这是 Knockout 中的一个已知问题还是我做错了什么?谢谢您的帮助!

4

2 回答 2

7

您尝试将 的contactData2作为第三个参数传递,Array.spliceArray.splice不支持将数组作为第三个参数。另请参阅文档

所以你需要写一些类似的东西

vmContacts.Contacts.splice(vmContacts.Contacts().length, 0, 
   contactData2[0], contactData2[1], contactData2[2], contactData2[3]);

或者您可以使用pushwithapply来“加入”您的两个数组:

vmContacts.Contacts.push.apply(vmContacts.Contacts,contactData2);

演示JSFiddle。

于 2013-03-14T16:50:34.247 回答
-1

您不是在创建一个包含可观察对象的视图模型,您只是将 JSON 解析为一个直接的 JS 对象。使用映射插件来做到这一点:

var contactData2 = ko.mapping.fromJSON(contactJSON1);

同样,我认为您不能不使用 foreach 循环将每个循环添加到数组中:

var contactData2 = ko.mapping.fromJSON(contactJSON2);
ko.utils.arrayForEach(contactData2(), function(item) {
vmContacts.Contacts.push(item);
于 2013-03-14T16:45:15.303 回答