将项目附加到淘汰赛阵列?

时间:2013-11-30 00:11:59

标签: knockout.js

我正在尝试使用包含数组的observable(不是observableArray,但如果需要可以更改它),并将相同类型的项追加到数组中,而不会执行foreach并通知订阅者推送的每个新项目。

我在SO和github上找到的每个帖子都尝试了几种不同的方法,但我尝试过的任何东西似乎都没有用。我可以毫无问题地替换内容 - 它只是添加了我遇到问题的项目。

小提琴:

http://jsfiddle.net/ckMJE/236/

我也试过这个无济于事:

 self.colors.push.apply(self.colors,self.newColors);

非常感谢任何帮助。

代码:

var ViewModel = function () {
    this.self = this;
    self.index = ko.observable(0); // default
    self.newColor = ko.observable("purple"); // default
    self.newColors = ko.observable([{
        color: 'it'
    }, {
        color: 'is'
    }, {
        color: 'working'
    }]);
    self.colors = ko.observable([{
        color: 'red'
    }, {
        color: 'blue'
    }, {
        color: 'yellow'
    }]);
    self.addSome = function () {
        ko.utils.arrayPushAll(self.colors, self.newColors);
    };
    self.replace = function () {
        self.colors(self.newColors());
    };
};
ko.applyBindings(new ViewModel());

2 个答案:

答案 0 :(得分:2)

1)您需要打开数组,对其进行操作,然后将observable设置为更改后的数组:

self.addSome = function () {
    self.newColors(ko.utils.arrayPushAll(self.colors(), self.newColors()));
};

2)除非您的第二行代码是拼写错误,否则您无意中使self成为全局代码,如果您最终使用嵌套的视图模型,这会给您带来很多麻烦。

答案 1 :(得分:1)

这里你去...只需要摆弄你的数组然后将组合的数组传回给你的observable。

http://jsfiddle.net/ckMJE/247/

    self.addSome = function () {
        var oldArray = self.colors(),
            newArray = self.newColors(),
            combinedArray = oldArray.concat(newArray);
        self.colors(combinedArray);
    };