我认为我有这个功能:
saveData: function(){
this.collection.setSelected(this.collection.where({name : this.$('#projects').val()}));
}
我的收藏中的相应功能:
setSelected: function(project){
this.each(function(model){
model.set({selected: false});
});
project[0].set({selected: true});
}
所以,我的问题是为什么我需要访问Project数组的第一个元素来访问实际的模型?我做错了吗?
另外,将集合设置中的所有模型循环到false然后将其设置为true似乎有点OTT,这是正确的做事方式吗?
答案 0 :(得分:0)
让我直截了当,这就是你想要实现的目标:
USER SELECTS VIEW ELEMENT
GET NAME FROM ELEMENT
VIEW SETS ALL MODELS SELECTED = FALSE
VIEW SETS MODEL MATCHING NAME SELECTED = TRUE
首先,我要说你不需要循环所有的模型,因为它看起来只有一个模型selected=true
。如果是这种情况,您可以简单地使用其他可用的underscore collection methods,我也只会将名称值传递给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
方法仍然需要在引擎盖下进行一些循环以找到匹配条件的模型,但它只搜索通过条件的第一个模型,因此它比执行{{1}更好无论如何,哪些循环都会模型化。
如果可以选择多个模型,显然这一切都会崩溃:D
<强>更新强>
在考虑您的问题后,我认为您可能会更好地使用不同的视图架构。在您描述的情况下,我个人通常使用微观视图。即每个型号的小视图。视图标记可能只包含一个复选框,而不是其他内容。
这意味着在主视图中,您可以循环您的集合,并为每个模型创建一个视图,将模型传递给视图,渲染它,并将标记附加到主视图。
通过这种方式,您可以更好地控制与特定模型相关的事件,并且可以轻松地将特定于模型的值渲染到视图中。下面这个简单的视图是一个微观视图的简单示例,其中模板只包含一个复选框和一个标签,或者类似的东西。
where
答案 1 :(得分:0)
为什么我需要访问Project数组的第一个元素才能访问实际模型?
答案是,根据documentation,where
会返回匹配模型的数组。因此,您需要使用索引访问它。
只要selected
只返回一个模型,我就没有看到用于将true
设置为where
的方法有任何问题。
第二个疑问
为什么不创建selected
为false
的所有模型(我假设没问题)并保留setSelected
方法:
setSelected = function(project, value) {
project[0].set({selected: value});
// well a better approach would be to define a method in the model saying,
// select() which sets the attribute, and call it from here with
// project[0].select(params), but its up to you how you do it.
}
您可以使用true
或false
至select
或deselect
任何型号调用相同的方法。
答案 2 :(得分:0)
为什么我需要访问Project数组的第一个元素才能访问实际的Model
因为你正在使用where
,它返回一个数组。在这种情况下,您可以使用find
,它返回第一个匹配的对象。
this.collection.find(function(x) { return x.get("name") == this.$('#projects').val() });
围绕集合中的所有模型循环似乎有点OTT
如果您只想一次选择一个模型,那么找到所选模型并取消选择可能会更好。类似的东西:
this.collection.setSelected(this.$('#projects').val());
和
setSelected: function(name){
var selected = this.find( function(x) { return this.get("selected") === true } );
if (typeof selected != "undefined") selected.set("selected", false);
var newSelected = this.find( function(x) { return this.get("name") === name });
if (typeof newSelected != "undefined") newSelected.set("selected", true);
}