我的解決方案是隻有一個observableArray,而不是兩個。
將從2個服務調用中收到的數據合併到一個對象列表中。
例如,
var orgChart = getDataFromFirstServiceCall();
var selectedDepartments = getDataFromSecondServiceCall();
var vm = {
departments = ko.observableArray(),
}
function Department(id , name) {
this.id = id;
this.name = name;
this.selected = selectedDepartments.indexOf(id) !== -1;
}
for(var i = 0; i < orgChart.length; i++) {
var dept = orgChart[i];
vm.departments.push(new Department(dept.id , dept.name);
}
ko.applyBindings(vm);
現在在你的HTML你可以這樣做:
<div data-bind="foreach: departments">
<div>
<input type="checkbox" data-bind="checked: selected }" />
<span data-bind="text: name"/>
</div>
</div>
編輯:
要通過將數據發送回服務器,只需循環該部門陣列並抓取selected
標誌設置爲true
var departments = vm.departments(),
selected = [];
for(var i = 0; i < departments.length; i++) {
var dept = departments[i];
if(dept.selected) selected.push(dept);
}
瞧!
或者如果您想要節省帶寬和/或刪除/插入語句到數據庫,您可以使selected
成爲可觀察的,訂閱它的更改,然後單獨將其保存到服務器。
function Department(id , name) {
var self = this;
self.id = id;
self.name = name;
self.selected = ko.observable(selectedDepartments.indexOf(id) !== -1);
self.selected.subscribe(function(newValue) {
// save newValue to the database
// perform an ajax POST, sending self.id and newValue
});
}
謝謝,我唯一關心的是這個策略是我需要selectedDepartments變量是可觀察的,以便它可以保存回數據庫。 – dizzyguy 2013-05-02 16:27:43
我以爲你可能會問這個問題。看看我的編輯。希望它有幫助 – Sethi 2013-05-02 16:38:44
再次感謝,我會試一試!我會給它一個檢查,如果它的工作。 – dizzyguy 2013-05-02 16:57:55