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

rro*_*oss 4 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);

});
Run Code Online (Sandbox Code Playgroud)

我能够从视图中的管理员那里获取信息,但无法从定义的角色中提取任何内容.当我在角色的.getJSON函数内添加警报时,它返回数据.在创建RolesViewModel和我这样调用它时似乎有问题:

<ul data-bind="foreach: definedRoles">
    <li data-bind="text: name"></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

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

Kye*_*ica 8

ko.applyBindings每个部分只能调用一次.如果未传递第二个参数,则该部分是整个页面.如果你有一个特定的部分,比如a 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);
});
Run Code Online (Sandbox Code Playgroud)

请记住,因为ko.applyBindings只需要调用一次,您应该尽早完成.由于几个原因,从ajax方法调用它通常是一个坏主意.一,ajax方法不再可以作为更新调用重用; 另外,其他页面功能必须等到ajax方法返回才能开始工作.


Dar*_*ian 7

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

ko.applyBindings(wallView,$("#WallKo")[0]);
Run Code Online (Sandbox Code Playgroud)

并使用选择了Id的div包装html

<div id = "WallKo">
    <div data-bind="foreach:posts">
         .....
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

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