我已经在这方面挣扎了一段时间,尝试了许多不同的不成功的方法。我会饶恕你尝试过的所有尝试,并告诉你我正在做什么。它看起来像这样..
// Retrieve unique list of items
self.items= ko.observableArray([]);
$.ajax({
url: self.options.itemsURL,
data: {},
dataType: "json",
success: function (data) {
data = data || {};
self.items(data);
self.items.unshift({"packet": "All","checked": "true"});
}
});
成功后,数据似乎被传递到self.items数组中。然后在名为“All”的数组顶部添加一个新元素。
这对于生成带有复选框的项目列表非常有用。但是,我需要能够监视和访问数据,以便知道有人检查了盒子,知道检查了哪些盒子,并在需要时修改盒子的值。默认情况下,选中“全部”选项。如果有人检查另一个盒子,我想要取消选中“全部”框。到目前为止,我在监视这些数组的所有尝试中都没有成功,但我不太了解这种编程风格。有人能指出我正确的方向来解决这个问题吗?
由于
答案 0 :(得分:1)
你的问题是,knockout observable数组跟踪数组中的哪些对象,而不是那些对象的状态(documentation)。
不是传入可观察数组的普通javascript对象,而是从这些对象中创建observable并将它们传递给数组。然后,您将能够观察到对象状态的任何变化......
答案 1 :(得分:0)
基本上详细说明@ Daniel的答案,您的代码可能类似于:
//Constructor for a regular list item
function ListItem(itemData) {
this.checked = ko.observable(false);
this.checked.subscribe(function () {
//Do something when this is checked or unchecked
});
}
//Constructor for that "all" list item
function ListItemAll() {
this.checked = ko.observable(true);
this.checked.subscribe(function () {
//Do something when this is checked or unchecked
});
}
// Retrieve unique list of items
self.items= ko.observableArray([]);
$.ajax({
url: self.options.itemsURL,
data: {},
dataType: "json",
success: function (data) {
data = data || [];
//Create viewModels from the data
var itemViewModels = data.map(funtion(itemData) {
return new ListItem(itemData);
});
self.items([new ListItemAll()].concat(itemViewModels));
}
});
你可以放弃构造函数,只为内联的每个项做逻辑;但重点是你要为数据中的每个项目选择/未检查状态的observable。