单击foreach中的父函数绑定

时间:2012-12-10 16:12:22

标签: knockout.js

我有以下html:

<div data-bind="foreach: Contacts">
   <a data-bind="click: $parent.Foo($data), text: Name">link</a>
</div>
<button data-bind="click: AddContacts">click</button>

和js代码:

var viewModel = ko.mapping.fromJS({"Selected":null,"Contacts":[]});
viewModel.AddContacts = function(){
    this.Contacts([{"Name":"C1"},{"Name":"C2"}]);
}

viewModel.Foo = function (contact) {
    alert(contact.Name);
}

ko.applyBindings(viewModel);

当我点击按钮时,会为每个联系人调用Foo。在点击任何链接之前,我根本没想到会调用它。

2 个答案:

答案 0 :(得分:17)

正如nemesv所说。该参数是函数引用。所以你正在做的是使用函数的结果作为点击事件。

您传递的函数调用将自动包含该项目的数据,因此您无需手动传递:

<div data-bind="foreach: Contacts">
   <a data-bind="click: $parent.Foo, text: Name">link</a>
</div>

http://jsfiddle.net/4cUv9/

答案 1 :(得分:8)

click绑定参数是函数引用。所以你需要将你的调用包装成一个匿名函数:

<div data-bind="foreach: Contacts">
   <a data-bind="click: function() { $parent.Foo($data); }, text: Name">link</a>
</div>

因此,当您想要将其他参数传递到click绑定时,需要将其包装以生成函数。另请参阅click documentation

中的示例

<button data-bind="click: AddContacts">表达式正常工作,因为您直接在那里引用AddContacts函数。