让我直截了当,这就是您要实现的目标:
USER SELECTS VIEW ELEMENT
GET NAME FROM ELEMENT
VIEW SETS ALL MODELS SELECTED = FALSE
VIEW SETS MODEL MATCHING NAME SELECTED = TRUE
首先我想说你不需要循环所有模型,因为看起来只有一个模型带有selected=true
. 如果是这种情况,您可以简单地使用其他一些可用的下划线集合方法,我也只会将名称值传递setSelected
给以在视图中保持简单:
saveData: function(){
this.collection.setSelected(this.$('#projects').val());
}
setSelected: function(name) {
this.findfindfunction(model) {
return model.get('selected');
}).set('selected', false);
this.find(function(model) {
return model.get('name') == name;
}).set('selected', true);
}
显然,使用该find
方法仍然需要在引擎盖下进行一些循环来找到与条件匹配的模型,但它只搜索第一个通过条件的模型,因此where
无论如何它都比执行 which loops ever 模型要好。
显然,如果可以选择多个模型,这一切都会崩溃:D
更新
在考虑您的问题多一点后,我认为使用不同的视图架构可能会更好地为您服务。在您描述的情况下,我个人通常使用微视图。即每个模型的小视图。视图标记可能只包含一个复选框,仅此而已。
这意味着在您的主视图中,您可以循环您的集合,并为每个模型创建一个视图,将模型传递给视图,渲染它,并将标记附加到主视图。
通过这种方式,您可以更好地控制与特定模型相关的事件,并且可以轻松地将模型特定值呈现到您的视图中。下面这个简单的视图是一个微视图的简单示例,其中模板仅包含一个复选框和一个标签,或者类似的东西。
var CheckboxView = Backbone.View.extend({
events: {
'input[type=checkbox]': 'select'
},
render: function () {
var html = _.template($('#myTemplate'), this.model.toJSON());
this.$el.html(html);
return this;
},
select: function () {
this.model.set('selected', true);
}
});