ko中是否有任何选项可以同时推送多个元素?
我有两个元素需要插入一个名为StatesList
的可观察数组中,我无法继续进行。我怎样才能添加它们。
见下文:
var model1 = jQuery.parseJSON(ko.toJSON(argsToPost));
var model = jQuery.parseJSON(ko.toJSON(self.StateModel));
我需要将两者都添加到我的ObservableArray
self.StatesList.push(model);
self.StatesList.push(model1);
这是插入不同的记录,我想同时插入两个对象
答案 0 :(得分:45)
我们确实有ko.utils.arrayPushAll(array, valuesToPush)
作为您可以使用的实用程序功能。 虽然不能直接使用observableArrays 。
如果添加pushAll to observableArrays
,则需要对基础数组(在您的情况下为this())进行操作,然后在最后valueHasMutated()
处调用observableArray
。这将确保observableArray
的订阅者仅通过最终结果而不是每次推送通知一次。
在KO核心中,它还需要事先调用valueWillMutate()
。
关键是我不建议使用您发布的代码,因为它会在每次推送时通知,如果您推送许多项目,这会对性能产生影响。
在核心,我们可能会做类似的事情:
ko.observableArray.fn.pushAll = function(valuesToPush) {
var underlyingArray = this();
this.valueWillMutate();
ko.utils.arrayPushAll(underlyingArray, valuesToPush);
this.valueHasMutated();
return this; //optional
};
在John Papa
和RP Niemeyer
之间进行了同样的讨论。可以找到该链接here。因此,仅在此处发布了有用的提示作为答案。
答案 1 :(得分:28)
尝试
ko.utils.arrayPushAll(self.StatesList, [model, model1]);
答案 2 :(得分:12)
在github上讨论过pushAll
函数,例如this issue或this pull request。据我所知,它尚未成为主要代码。
然而,您可以轻松实现这样的推送:
var items = ko.observableArray();
items.push.apply(items, [1, 2, 3, 4]);
由stalniy在第二篇参考文献中评论。这样做的缺点是淘汰赛会在每一个项目推出后通知订阅者。
可替换地,
function concat(the_list, items_to_concat) {
the_list.splice.apply(the_list, [the_list().length, 0].concat(items_to_concat));
}
因此使用observableArray
splice
实现,正如brianmhunt在同一个帖子中所建议的那样。