如何在ajax成功后修改json数据?

时间:2014-11-03 23:16:59

标签: javascript ajax json knockout.js

我已经在这方面挣扎了一段时间,尝试了许多不同的不成功的方法。我会饶恕你尝试过的所有尝试,并告诉你我正在做什么。它看起来像这样..

// 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”的数组顶部添加一个新元素。

这对于生成带有复选框的项目列表非常有用。但是,我需要能够监视和访问数据,以便知道有人检查了盒子,知道检查了哪些盒子,并在需要时修改盒子的值。默认情况下,选中“全部”选项。如果有人检查另一个盒子,我想要取消选中“全部”框。到目前为止,我在监视这些数组的所有尝试中都没有成功,但我不太了解这种编程风格。有人能指出我正确的方向来解决这个问题吗?

由于

2 个答案:

答案 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。