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

Knockout.js 将新的项数组拼接到现有的敲除可观察数组会导致绑定错误,knockout.js,Knockout.js,我有一个敲除的可观察数组,在加载网页时填充一些初始值,我想在用户与页面交互时通过拼接方法添加到可观察数组中。我尝试添加到数组中的新项与数组中的原始项具有完全相同的属性,但当我尝试将新项拼接到现有数组中时,会出现一个敲除绑定错误,例如:“错误:无法解析绑定。消息:ReferenceError:ContactName未定义;绑定值:text:ContactName”. 即使新数组中的所有项上都存在有问题的属性,也会发生此错误。我试图在敲除可观察数组上进行拼接,而不是在底层数组对象上,因为我希望绑定

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

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


我希望避免在新对象数组中循环,以对我需要添加的每个项执行push(),这是拼接应该起作用的地方,但事实并非如此。这是淘汰赛中的一个已知问题还是我做错了什么?谢谢你的帮助

您不是在创建包含可观察对象的视图模型,而是将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);

您试图将
contactData2
作为
数组的第三个参数传递。splice
但是
数组。splice
不支持数组作为第三个参数。另见中的

所以你需要写一些像

vmContacts.Contacts.splice(vmContacts.Contacts().length, 0, 
   contactData2[0], contactData2[1], contactData2[2], contactData2[3]);
或者您可以将
推送
应用
一起使用,以“连接”两个阵列:

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

演示

你到底在哪里找到了关于apply的信息push的systax是数组。push(element1,…,elementN)
apply
允许调用以下任何函数:
theFunction.apply(valueForThis,arrayOfArgs)
请看真棒,感谢nemesv指出这一点,并感谢您提供的有用的apply()提示!我不敢相信我忽略了这一点,我想我需要休息一下:)谢谢你的回复,在我的示例中,视图模型是ContactsViewModel,带有可观察数组。您是对的,我只是将JSON字符串解析为一个普通的JS数组,但我将其放入viewmodel中的可观察数组中。只有当我想让每个单独的数组项都可见时,映射插件才是必要的。