为一个页面使用两个Knockout视图模型

时间:2013-03-25 17:50:33

标签: asp.net-mvc-4 knockout.js knockout-mvc

我在淘汰赛中设置了两个视图模型。

$.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>

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:8)

ko.applyBindings每个部分只能调用一次。如果未传递第二个参数,则该部分是整个页面。如果您有特定的部分,例如DIV,则应将其作为第二个参数传递。

或者,您可以为页面创建一个viewmodel,并为两个列表创建一个属性,然后将页面绑定到此单个viewmodel。我推荐这种方法。该代码可能如下所示:

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方法返回才能开始工作。

答案 1 :(得分:7)

Tyrsius答案是正确的,但为了将来参考,您可以将两个不同的视图模型绑定到同一页面。您必须绑定模型,如

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

并使用选择Id的div包装html,即

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

然后,您可以为每个页面提供任意数量的视图模型。

答案 2 :(得分:0)

感谢HOW将模型绑定到特定div的示例。非常有帮助