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

时间:2014-05-12 10:24:55

标签: knockout.js

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);

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

3 个答案:

答案 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 PapaRP Niemeyer之间进行了同样的讨论。可以找到该链接here。因此,仅在此处发布了有用的提示作为答案。

答案 1 :(得分:28)

尝试

ko.utils.arrayPushAll(self.StatesList, [model, model1]);

答案 2 :(得分:12)

在github上讨论过pushAll函数,例如this issuethis 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在同一个帖子中所建议的那样。

顺便说一句:我承认我并不知道这一点,我只是用Google搜索"推动许多淘汰赛#34;