我第一次尝试使用 jsrender/jsviews。它看起来很棒,但我找不到明确的文档或示例如何为生成的内容动态绑定事件处理程序。
例如纯 jQuery 旧方法是:
从 bean 类中渲染对象集合的代码:
container = $('#tabs-my');
this.load( // Obtain array of objects
$.proxy(function(list){
container.html('');
list.forEach(
$.proxy(function(it, i){
container.append(this.renderItem(it));
}
,this)
);
}
,this)
);
而在对象本身的渲染方法中:
,renderItem: function(/*Specialist*/ it){
var container = $('<div class="specialist-item" />')
container.append(
$('<span class="x">Remove</span>').click($.proxy(function(){
this.removeSpecialistFromList(it.id)
}
,this))
);
container.append(
$('<span class="x">Edit</span>').click($.proxy(function(){
this.renderSaveForm(container)
}
,this))
);
container.append('<p><b>' + it.name + '</b> <i>' + it.phone + '</i></p>' +
'<p>' + it.skill + '</p>' +
( it.city ? '<p>' + it.city.name + '</p>' : ''));
return container;
}
注意我通过闭包内容为当前对象绑定处理程序,而不在标签本身中使用任何外部标识符。然后我尝试使用模板将内容与可视化分开。
我的模板:
<div class="specialists-list">
Items in list: {{:specialists.length}}
{^{for specialists}}
<div class="specialist-item">
<span class="x">Remove</span><span class="x">Edit</span>
<p><b class="name">{{:name}}</b> <i class="phone">{{:phone}}</i></p>
<p class="skill">{{:skill}}</p>
<p class="city">{{:city.name}}</p>
</div>
{{/for}}
</div>
并呈现为:
var template = $.templates({
specialistsTmpl: tmpl
});
$.templates.specialistsTmpl.link(container, {
specialists: list
});
我意识到可以使用属性中的通用处理程序来完成,例如:
<span class="x" data-id="{{:id}}">Edit</span>
然后尝试再次从外部获取该对象。但它是解决方法,不是我们想要的。有没有办法在模板中或通过助手、自定义标签绑定处理程序?