11

我有以下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。在单击任何链接之前,我根本没想到会调用它。

4

2 回答 2

18

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

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

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

http://jsfiddle.net/4cUv9/

于 2012-12-10T16:19:49.977 回答
10

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

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

因此,当您想将其他参数传递到您的click绑定中时,您需要将其包装成一个函数。另请参阅click 文档中的示例

<button data-bind="click: AddContacts">表达式有效,因为您在AddContacts那里直接引用了该函数。

于 2012-12-10T16:15:41.603 回答