2012-12-10 22 views
10

結合於母公司的功能,我有以下的html:單擊的foreach

<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是要求每個聯繫人。我沒有想到,直到任何鏈接被點擊,纔會調用它。

回答

16

由於nemesv表示。該參數是一個函數引用。所以你在做什麼是使用函數的結果作爲點擊事件。

您傳遞會自動包含該項目的數據,這樣你就不需要手動將它傳遞給你的函數調用:

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

http://jsfiddle.net/4cUv9/

+13

警告:與上面的代碼,在富(),「this」變量將* not *爲viewModel。這個例子的工作原理是因爲在Foo中沒有使用「this」。要獲得「這個」是正確的,你會做「點擊:$ parent.Foo.bind($ parent)」。見http://jsfiddle.net/4cUv9/ – pettys

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函數。