Knockout有一個很好的功能被稱爲計算函數here,它實際上是一個依賴於模型中其他可觀察對象的函數,並且只要這些依賴關係發生任何變化就會自動更新。所以你的情況,只要更改狀態觀察到的,因爲你已經在使用它計算函數裏面,你的計算功能將自動觸發,然後根據您所在州或任何其他可觀察您發送使用Ajax和成功更新的請求您模型。
下面是如何處理一個簡單的例子:
例子:https://jsfiddle.net/kyr6w2x3/156/
HTML:
<select data-bind="value:State">
<option value="1"> state 1</option>
<option value="2"> state 2</option>
<option value="3"> state 3</option>
</select>
<ul data-bind="foreach:MyArray">
<li>
<span data-bind="text:Name"></span>
</li>
</ul>
VM:
var data1 = [{ Id: 1, Name: "Name 1" },{ Id: 2, Name: "Name 2" },{ Id: 3, Name: "Name 3" } ];
var data2 = [{ Id: 10, Name: "Name 10" },{ Id: 20, Name: "Name 20" },{ Id: 30, Name: "Name 30" } ];
var data3 = [{ Id: 100, Name: "Name 100" },{ Id: 200, Name: "Name 200" },{ Id: 300, Name: "Name 300" } ];
var data = [];
function MainViewModel(){
var self = this;
self.MyArray = ko.observableArray([]);
self.State = ko.observable(1)
self.LoadTab = ko.computed(function() {
switch(self.State()){
case "1":
data = data1;
break;
case "2":
data = data2;
break;
case "3":
data = data3;
break;
}
//Call your ajax based on state here and update your array in ajax's success.
self.MyArray($.map(data, function (item) {
return new ItemViewModel(item);
}));
}, self);
}
function ItemViewModel (data){
var self = this;
self.Id = ko.observable(data.Id);
self.Name = ko.observable(data.Name);
}
var viewModel = new MainViewModel();
ko.applyBindings(viewModel);
我建議做'MYARRAY計算的屬性,它只需要你使'calculate'返回'map'操作的結果ñ。目前,它沒有返回任何東西,這使得'LoadTab()'總是'undefined'。因爲它只是引用'State',你也可以用'self.State.subscribe()'是'設置更換MyArray'它。 (請注意,您也可以使用'computed'作爲'subscription',而不存儲引用)。 – user3297291