骨干 - 我正确访问此模型吗?

时间:2012-12-04 11:23:29

标签: backbone.js

我认为我有这个功能:

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,这是正确的做事方式吗?

3 个答案:

答案 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数组的第一个元素才能访问实际模型?

答案是,根据documentationwhere会返回匹配模型的数组。因此,您需要使用索引访问它。

只要selected只返回一个模型,我就没有看到用于将true设置为where的方法有任何问题。

第二个疑问

为什么不创建selectedfalse的所有模型(我假设没问题)并保留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.
}

您可以使用truefalseselectdeselect任何型号调用相同的方法。

答案 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);
}