21

我想知道是否可以多次使用Knockout.js将不同的ViewModel 绑定到页面的一部分。ko.applyBindings()例如,假设我有这个:

<div id="foo">...</div>
...
ko.applyBindings(new PageViewModel());
ko.applyBindings(new PartialViewModel(), $('#foo')[0]);

我现在将两个 ViewModel 绑定应用到<div id="foo>. 这合法吗?

4

4 回答 4

20

您不想在同一个元素上多次调用 ko.applyBindings。最好的情况是,元素在更新时会做比必要的工作更多的工作,更糟糕的情况是,您将有多个事件处理程序为同一个元素触发。

有几个选项可以处理这种类型的事情,这里详细介绍: 多视图应用程序的敲除模式示例

如果您确实需要在您的内容中间有一个“岛”,以便稍后调用应用绑定,那么您可以使用此处描述的技术:http ://www.knockmeout.net/2012/05/quick-tip -skip-binding.html

于 2012-12-26T20:47:26.043 回答
16

这是实现 JqueryMobile-SPA 时遇到的常见障碍。方法 : ko.applyBindings( viewmode, root dom element) 接受两个参数。当您的页面中有多个 VM 时,第二个参数会很有帮助。

例如 :

ko.applyBindings(model1, document.getElementById("view1")); 
ko.applyBindings(model2, document.getElementById("view2"));

其中 view1 和 view2 是该模型的根 dom 元素。对于 JqueryMobile-SPA,这将是相应模型的页面 ID。

于 2013-02-06T08:31:55.077 回答
11

最好的方法是在要绑定局部视图模型的 div 中使用“with”绑定构造。你可以在这个小提琴中找到它

<div data-bind="with: model">
   <p data-bind="text: name"></p>
</div>

<div data-bind="with: anothermodel">
   <p data-bind="text: name"></p>
</div>​

var model = {
   name: ko.observable('somename'),
}

var anothermodel = {
    name: ko.observable('someanothername'),
}
ko.applyBindings(model);​

还可以查看Knockout 站点上的“with”绑定文档,了解 AJAX 回调 - 部分绑定场景。

于 2012-12-26T20:45:02.643 回答
2

我的英语很糟糕.... =)

我使用 Sammy 加载部分视图,并使用 Knockout 绑定模型,我尝试使用ko.cleanNode但清理所有绑定,所有 DOM 节点在绑定时都已更改,属性__ko__已聚合,然后我使用此代码删除了该属性,并且可以正常工作!!,'#main'是我的节点。

var dom = dom || $("#main")[0];
for (var i in dom) {
  if (i.substr(0, 6) == "__ko__") {
     delete (dom[i]);
     break;
  }
}

使用 Ggle 翻译器后:

我使用 Sammy 加载部分视图,并使用 Knockout 绑定模型,我尝试使用 ko.cleanNode 但清理我的所有绑定,所有 DOM 节点在绑定时都已更改,聚合属性ko,然后我使用此代码删除了该属性,并且可以正常工作!!,“#main”是我的节点。

于 2013-07-23T23:18:57.690 回答