如何在knockout viewmodel点击事件中访问$ parent或$ parents []?

Nul*_*nce 19 knockout.js

我有一种情况,我想通知祖父母或$ parent [1]发生在子视图模型中的点击事件.所以基本上我希望能够做到这一点

self.$parents[1].actionTaken
Run Code Online (Sandbox Code Playgroud)

我认为这不起作用,因为绑定上下文与viewModel,但我想听听是否有人有正确的方法来做这样的事情的想法.谢谢

 self.save = function () {

     //do stuff to self first, then

      self.$parents[1].actionTaken();

};
Run Code Online (Sandbox Code Playgroud)

Uwe*_*weB 20

或者,您可以通过以下方式将参数传递给视图模型的事件处理程序:更改save方法

self.save = function(theParents) {
    theParents[1].actionTaken();
}
Run Code Online (Sandbox Code Playgroud)

并按以下方式绑定您的处理程序:

data-bind="click: function() { $data.save($parents) }"
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅单击处理程序文档中的注释2(需要稍微降低一点)


And*_*ers 18

或者使用这个bind技巧

data-bind="click: $parent.foo.bind($parent)"
Run Code Online (Sandbox Code Playgroud)

现在,当您访问foo函数时,this关键字将指向父上下文.

foo: function(child) {
   this.children.remove(child);
}
Run Code Online (Sandbox Code Playgroud)

  • 与接受的答案相比,(对我来说)读取和功能更好. (2认同)

mae*_*ets 11

现在(使用knockout 3.0.0)可以向子函数添加两个参数(由click绑定执行),第一个将被分配当前的viewmodel,第二个将被分配click事件args.

然后调用ko.contextFor()并传递事件目标,您将可以通过上下文对象访问$ parent.

this.myChildFunction = function (vm, e) {
  var context = ko.contextFor(e.target);
  context.$parent.myParentFunction();
};
Run Code Online (Sandbox Code Playgroud)

(不知道在其他答案的时候这是否可能......)