这个问题用backbone.js标记,所以你应该使用Backbone 的普通视图事件处理系统而不是onclick
处理程序。你提到的tasks.models
这么想大概tasks
是一个集合。
一种方法是使用数据属性来存储模型id
。您的模板将如下所示:
{{#each tasks}}
<div>
{{name}} - <button data-id="{{id}}" type="button">Completed</button>
</div>
{{/each}}
然后您的视图将设置如下:
Backbone.View.extend({
events: {
'click button': 'completed'
},
render: function() {
var t = Handlebars.compile($('#whatever-the-template-is').html());
this.$el.append(t({
tasks: this.collection.toJSON()
}));
return this;
},
completed: function(ev) {
var id = $(ev.currentTarget).data('id');
var m = this.collection.get(id);
// Do whatever needs to be done to the model `m`...
}
});
演示: https ://jsfiddle.net/ambiguous/z7go5ubj/
所有代码都保留在视图中(所有数据都已经存在),模板只处理演示。没有全局变量、良好的关注点分离和惯用的 Backbone 结构。
如果视图的每个模型部分更复杂,那么您可以为每个模型的集合和子视图创建一个视图。在这种情况下,您的每个模型模板将如下所示:
<div>
{{name}} - <button type="button">Completed</button>
</div>
不再需要数据属性。您将拥有一个新的每个模型视图,如下所示:
var VM = Backbone.View.extend({
events: {
'click button': 'completed'
},
render: function() {
var t = Handlebars.compile($('#whatever-the-template-is').html());
this.$el.append(t(this.model.toJSON()));
return this;
},
completed: function() {
console.log('completed: ', this.model.toJSON());
}
});
并且循环将移动到集合视图:
var VC = Backbone.View.extend({
render: function() {
this.collection.each(function(m) {
var v = new VM({ model: m });
this.$el.append(v.render().el);
}, this);
return this;
}
});
演示: https ://jsfiddle.net/ambiguous/5h5gwhep/
当然,在现实生活中,您VC
会跟踪它VM
的 s,以便VC#remove
可以调用remove
它的所有子VM
s。