2013-03-25 55 views
4

我正在建立兩個視圖模型。在一個頁面中使用兩個Knockout視圖模型

$.getJSON("/api/administrators", function (data) {   
    var AccessViewModel = { 
     administrators: ko.observableArray(data) 
    }; 
    ko.applyBindings(AccessViewModel); 

}); 

$.getJSON("/api/roles", function (data) { 
    var RolesViewModel = { 
     definedRoles: ko.observableArray(data) 
    }; 
    ko.applyBindings(RolesViewModel); 

}); 

我能夠從視圖中的管理員處獲取信息,但無法從定義的角色中提取任何內容。 當我在角色的.getJSON函數中添加警報時,它將返回數據。看來事情是創建RolesViewModel之間的錯誤,當我把它稱爲像這樣:

<ul data-bind="foreach: definedRoles"> 
    <li data-bind="text: name"></li> 
</ul> 

有人能指出我在正確的方向?

回答

8

ko.applyBindings每段只能調用一次。如果您未傳遞第二個參數,則該部分是整個頁面。如果您有特定部分,如DIV,則應將其作爲第二個參數傳入。

或者,您可以爲頁面創建一個視圖模型,併爲這兩個列表創建一個屬性,並將您的頁面綁定到此單個視圖模型。我推薦這種方法。該代碼可能是這樣的:

var ViewModel = function() { 
    this.administrators = ko.observableArray([]); 
    this.definedRoles = ko.observableArray([]); 
}; 

var vm = new ViewModel(); 
ko.applyBindings(vm); 

$.getJSON("/api/administrators", function (data) { 
    vm.administratos(data); 
}); 

$.getJSON("/api/roles", function (data) { 
    vm.definedRoles(data); 
}); 

記住,因爲ko.applyBindings只需要調用一次,你應該儘早做到這一點。由於幾個原因,從ajax方法調用它通常是一個糟糕的主意。其一,ajax方法不再可作爲更新調用重用;和其他頁面功能必須等到ajax方法返回開始工作。

+0

在這種情況下,管理員的行爲在哪裏? – rross 2013-04-17 17:09:34

+1

@rross什麼樣的行爲? – Tyrsius 2013-04-17 17:24:14

7

Tyrsius答案是正確的,但爲了將來的參考,您可以將兩個不同的視圖模型綁定到同一頁面。你將不得不綁定的車型,如

ko.applyBindings(wallView,$("#WallKo")[0]); 

,並與選上的ID的DIV包住HTML即

<div id = "WallKo"> 
    <div data-bind="foreach:posts"> 
     ..... 
    </div> 
</div> 

然後,只要你想爲每個頁面,你可以有很多視圖模型。

+0

我在第一段中就這麼說... – Tyrsius 2013-03-26 15:14:32

+0

對不起,沒有注意到。哦,好吧,它會進一步提高你的觀點 – Darussian 2013-03-26 21:20:03

0

感謝如何將模型綁定到特定div的示例。非常有幫助

相關問題