无法从任何上下文访问Knockout viewmodel方法

时间:2018-05-20 16:32:54

标签: knockout.js

我有一个嵌套的视图模型,它有一些我无法从当前上下文或父上下文访问的方法。

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中访问方法?

1 个答案:

答案 0 :(得分:0)

Knockout绑定上下文不一定反映视图模型的结构。它们是基于html标记创建的

  

each time you use a control flow binding such as "with" or "foreach", that creates a child binding context that refers to the nested view model data.

在您的视图模型中,层次结构是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'])