2012-03-17 66 views
3

我有以下KnockoutJS模板(与jquery.tmpl渲染):KnockoutJS - 点击模板事件

<script id="contactsTemplate" type="text/html"> 
    <li data-bind="click: contactViewModel.test">${DisplayName}</li> 
</script> 

<ul id="contact-list" data-bind="template: {name: 'contactsTemplate', foreach:contacts}"> 
</ul> 

和下面的模型视图:

var contactViewModel = function (contacts) { 
var self = this; 

self.contacts = contacts; 

self.test= function() { 
    console.log("CLICK"); 
} 

,如果我使用此代码,点击事件不会触发。如果我创建像一个匿名函数:

<script id="contactsTemplate" type="text/html"> 
    <li data-bind="click: function(){contactViewModel.test()}">${DisplayName}</li> 
</script> 

我得到以下异常:

Uncaught TypeError: Object function (contacts) { 
var self = this; 
self.contacts = contacts; 
self.test= function() { 
    console.log("CLICK"); 
} 
} has no method 'test' 

SOLUTION

的解决办法是:$父。

data-bind="click: $parent.test" 

回答

3

contactViewModel函数是一个构造函数,但是,你要使用它像已经通过函数构造一个对象的实例。您的contactViewModel公开了一组您正在绑定到contactsTemplate模板的联系人。出于这个原因,此模板中所有绑定的“上下文”都是数组中的对象实例。绑定到父对象上的功能,即contactViewModel,使用基因敲除2.0父伪变量:

data-bind="click: $parent.test" 
+0

看来这是行不通的,它打破了,他将第一个元素之后。我的绑定:ko.applyBindings(new contactViewModel(contacts),$(“#contact”)[0]); – 2012-03-17 12:17:26

+0

@KaffeeBohne - 啊...我看到你的问题。我已经更新了我的答案。 – ColinE 2012-03-17 12:58:09