将新的项目数组拼接到现有的Knockout可观察数组会导致绑定错误

时间:2013-03-14 16:39:48

标签: knockout.js

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

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

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

2 个答案:

答案 0 :(得分:7)

您尝试将contactData2作为Array.splice的第三个参数传递,但Array.splice不支持将数组作为第三个参数。另见documentation

所以你需要写一些像

这样的东西
vmContacts.Contacts.splice(vmContacts.Contacts().length, 0, 
   contactData2[0], contactData2[1], contactData2[2], contactData2[3]);

或者您可以将pushapply一起使用,以“加入”您的两个数组:

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

演示JSFiddle.

答案 1 :(得分:-1)

您不是在其中创建具有observable的视图模型,而只是将JSON解析为直接的JS对象。使用mapping plugin执行此操作:

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

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

var contactData2 = ko.mapping.fromJSON(contactJSON2);
ko.utils.arrayForEach(contactData2(), function(item) {
vmContacts.Contacts.push(item);