我有一个嵌套的视图模型,它有一些我无法从当前上下文或父上下文访问的方法。
viewmodel的简化版本显示了相同的问题:
ModelB = function () {
var self=this;
self.listItems = ko.observableArray(['one','two']);
self.clickMe = function () {
alert('clicked');
};
};
ModelA = function () {
var self = this;
self.modelBList = new ModelB();
};
ko.applyBindings(new ModelA());
与视图一起使用
<ul data-bind="foreach: modelBList.listItems">
<li data-bind="text: $data, click: $parent.clickMe"></li>
</ul>
当我点击其中一个<li>
元素时,无法正常工作,没有任何反应。
使用开发人员工具,我发现在<li>
元素$parent
中正在解析根上下文,即ModelA,而不是我预期的ModelB。
如何在ModelB中访问方法?
答案 0 :(得分:0)
Knockout绑定上下文不一定反映视图模型的结构。它们是基于html标记创建的
在您的视图模型中,层次结构是ModelA - &gt; ModelB,但是在标记中有$ root,它是ModelA,然后创建的下一个上下文是listItems数组,因此它的父元素直接映射到根(ModelA),完全跳过ModelB。绑定到&#34; ModelB.listItems&#34;没有为路径的每个部分创建一个上下文,它只是告诉它要绑定的最终目标。
如果你想为ModelB创建一个中间上下文,你可以先使用&#34; with&#34;绑定,使用div或无容器绑定:
<li data-bind="text: $data, click: $parent.modelBList.clickMe"></li>
或者正如Jose Luis所说,您可以使用
从现有的上下文中导航len([k for d in data for k in d.keys() if k == 'a'])