我有一种情况,我想通知祖父母或$ parent [1]发生在子视图模型中的点击事件。所以基本上我希望能够做到这一点
self.$parents[1].actionTaken
我认为这不起作用,因为绑定上下文与viewModel,但我想听听是否有人有正确的方法来做这样的事情的想法。感谢
self.save = function () {
//do stuff to self first, then
self.$parents[1].actionTaken();
};
答案 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