2014-11-03 95 views
0

我一直在努力嘗試許多不同的不成功方法。我會盡全力嘗試我嘗試過的所有嘗試,並向您展示我正在與之合作的內容。它看起來像這樣..如何在ajax成功後修改json數據?

// 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

這聽起來像komapping會爲你工作,因爲你需要知道每個數組項目的狀態。如果你做了一些像self.items = ko.observableArray(komapping.fromJS(data)),它會使每個屬性都是可觀察的。然後你可以說訂閱改變事件 – segFault 2014-11-04 00:09:56

+0

旁註;當然應該是'data = data || []'? – Retsam 2014-11-04 02:05:31

回答

0

基本上闡述@丹尼爾的回答,你的代碼可能看起來像:

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

您可以刪除構造函數,只是爲每個項目內聯邏輯;但主要的一點是,你會希望觀察數據中每個項目的選中/未選中狀態。

+0

Thanks Retsam,這是一個很好的開始,並且正在監視數組對象。這解決了我的一半問題。 問題的另一半如果選中「All」,則將複選框的值設置爲false,或者如果選中其他內容,則將「All」設置爲取消選中。你能指點我的方向來訪問單個列表項功能之外的數據值嗎? – Nerdifiedgeek 2014-11-04 17:28:55

+0

您可以在ListItem構造函數中引用'self.items';或者您可以將'checked'觀察值中的訂閱移動到'success'回調中。 'var listItem = new ListItem(itemData); listItem.checked.subscribe(function(){})' – Retsam 2014-11-05 02:03:25

1

你的問題是,敲除可觀察到的數組跟蹤哪些對象是在陣列中,這些對象(documentation)的不狀態。

而不是傳入可觀察數組的正常JavaScript對象,從這些對象創建observables並將它們傳遞給數組。然後,你就可以觀察到任何的對象的狀態的變化...