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

时间:2013-08-09 00:23:19

标签: knockout.js

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

self.$parents[1].actionTaken

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

 self.save = function () {

     //do stuff to self first, then

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

};

4 个答案:

答案 0 :(得分:19)

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

self.save = function(theParents) {
    theParents[1].actionTaken();
}

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

data-bind="click: function() { $data.save($parents) }"

有关详细信息,请参阅Note 2 in the click handler's documentation(您需要稍微贬低)

答案 1 :(得分:18)

或使用bind技巧

data-bind="click: $parent.foo.bind($parent)"

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

foo: function(child) {
   this.children.remove(child);
}

答案 2 :(得分:10)

现在(使用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();
};

(不知道在其他答案期间这是否可行......)

答案 3 :(得分:3)

实际上,动作是在knockoutjs世界的viewmodel中定义的。 $ parents / $数据是'上下文'。 我创建了一个数据结构来展示您的需求。 公司> 销售部门>的雇员

你可以在这个jsfiddle例子中找到它: invoke root action in child event

如果您仍想出于某种原因这样做,您还可以在祖父母的上下文中定义 actionTaken()函数(而不是视图模型方法)。但这可能不是一种通常的方式。无论如何,请查看:

self.company={name:'ABC', click:function(){self.onCompClicked();}, salesDepartment:{manager:'Mgr',employees:['Smith','John']}};

然后将绑定点击事件更改为:

data-bind="text: $data, click: $parents[1].click"

第2版的更新代码如下: invoke context action in child event