1

我见过类似的 主题,但没有一个使用与我完全相同的结构。

我正在使用多个视图模型,我通过创建一个 MasterModel 函数来处理它,稍后我将其作为参数传递给applyBindings.

基本上是这样的:

var MasterModel = function(){
    this.user = new UserViewModel();
    this.department = new DepartmentViewModel();
}

ko.applyBindings(MasterModel);

现在,我希望能够从 Javascript 访问我的一个视图模型中的函数,但我遇到了麻烦。

如果我将其更改为以下内容,我设法调用了 viewmodel 函数applyBindings

var mm = new MasterModel();
ko.applyBindings(mm);

mm.user.sayHi();

但后来我发现以下内容停止工作:

<ul data-bind="foreach: department.list()">
     <li data-bind="text: department.getDemo($data)"></li>
</ul>

消息:部门未定义

在线复制

正如您在此处看到的,它在使用时完美运行ko.applyBindings(MasterModel);

有什么解决办法吗?

4

2 回答 2

2

您需要将 Knockout 指向正确的方向才能使用department

<li data-bind="text: $root.department.getDemo($data)"></li>

当您在foreach循环中时,范围是您当前正在迭代的项目,并且该项目(显然)没有该department属性。

您需要用来$root告诉 Knockout 它是在department您所指的根视图模型上定义的。

请参阅小提琴文档

于 2015-07-15T11:54:10.553 回答
1

在 foreach 内部,您无法直接访问,department因为 foreach 引入了自己的绑定上下文。您可以使用$root$parent访问您的 MasterModel:

<ul data-bind="foreach: department.list()">
   <li data-bind="text: $parent.department.getDemo($data)"></li>
</ul>

http://jsfiddle.net/qWmat/109/

绑定上下文是一个对象,其中包含您可以从绑定中引用的数据。在应用绑定时,Knockout 会自动创建和管理绑定上下文的层次结构。层次结构的根级别是指您提供给 ko.applyBindings(viewModel) 的 viewModel 参数。然后,每次您使用控制流绑定(例如 with 或 foreach)时,都会创建一个引用嵌套视图模型数据的子绑定上下文。

阅读更多

于 2015-07-15T11:54:24.923 回答