我正在尝试使用包含数组的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());
答案 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);
};