可观察数组在knockout.js中推送多个对象

Aj_*_*ari 31 knockout.js

ko中是否有任何选项可以同时推送多个元素?

我有两个元素需要插入一个名为的可观察数组中StatesList,我无法继续进行.我怎样才能添加它们.

见下文:

var model1 = jQuery.parseJSON(ko.toJSON(argsToPost));
var model = jQuery.parseJSON(ko.toJSON(self.StateModel));
Run Code Online (Sandbox Code Playgroud)

我需要添加两个 ObservableArray

self.StatesList.push(model);
self.StatesList.push(model1);
Run Code Online (Sandbox Code Playgroud)

这是插入不同的记录,我想同时插入两个对象

Raj*_*dev 46

我们确实有ko.utils.arrayPushAll(array, valuesToPush)一个可以使用的实用功能.但它不能直接从observableArrays中获得.

如果你把你的pushAll to observableArrays,你会想(在这种情况下,()),底层阵列上运行,然后调用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
};
Run Code Online (Sandbox Code Playgroud)

John Papa和之间发生了同样的讨论RP Niemeyer.链接可以在这里找到.因此,仅在此处发布了有用的提示作为答案.

  • @Slight你是对的.对于20,000件商品,concat在IE11和Chrome中更快.但如果只有20个项目,循环更快.20项:http://jsperf.com/array-prototype-push-apply-vs-concat/5 (2认同)

phi*_*ooo 28

尝试

ko.utils.arrayPushAll(self.StatesList, [model, model1]);
Run Code Online (Sandbox Code Playgroud)


chi*_*oro 12

pushAll已经在github上讨论了一个函数,参见例如此问题此拉取请求.据我所知,它尚未成为主要代码.

但是你可以很容易地实现像这样的推送:

var items = ko.observableArray();

items.push.apply(items, [1, 2, 3, 4]);
Run Code Online (Sandbox Code Playgroud)

由stalniy在第二篇参考文献中评论.这样做的缺点是淘汰赛会在推送每一件物品后通知订户.

或者,

function concat(the_list, items_to_concat) {
    the_list.splice.apply(the_list, [the_list().length, 0].concat(items_to_concat));
}
Run Code Online (Sandbox Code Playgroud)

因此,正如brianmhunt在同一个线程上所建议的那样利用了它observableArraysplice实现.

顺便说一句:我承认我不知道这个,我只是用谷歌搜索"推许多淘汰赛"