迭代在backbone.js中的集合

时间:2011-08-31 20:45:42

标签: javascript backbone.js

var User = Backbone.Model.extend({
  defaults : { 
    "students" : [ 
    {   
      name : "abc",
      grade: "A",
      school: "xyz"
     }], 
     "interest":
     {   
       music : "yes"
     }   
    }   
});

var UserList = Backbone.Collection.extend({  
  model : User,
});

var obj = new UserList({"students" : [{name:"Rax", grade: "B", school : "javiers"}, {name:"John", grade: "C", school : "loreto"}], "interest" : {music: "yes"}});

for(var i = 0; i < obj.students.length; i++) {
  console.log(obj.students.at(i).get("name"));
  console.log(obj.students.at(i).get("grade"));
  console.log(obj.students.at(i).get("school"));
}

//i want to iterate over each students detail(name, grade and school) ..but this is giving me error " obj.students is undefined " ..why this error is coming?

2 个答案:

答案 0 :(得分:4)

首先,有几个语法错误,所以请查看控制台并修复这些错误。此外,传递给集合的对象在概念上是错误的。

Collection是一个“用户列表”,模型是一个用户。所以,也许你应该改变defaults数据描述。为用户制作students数组是没有意义的。

此外,当您创建Collection实例时,您可以使用create method创建模型,而不是仅仅传入哈希。您可以通过这种方式设计模型,但不能使用Collection。

因此,当你想创建一个用户时,你只传递一个“学生”,也许是这样的(你也必须在你的Collection中加入“url”键,否则它将无效):

var User = Backbone.Model.extend({
    defaults : { 
      "students" : [{   
        name : "abc",
        grade: "A",
        school: "xyz"
       }], 
       "interest":{   
         music : "yes"
       }   
    }
  });

  var UserList = Backbone.Collection.extend({  
    model : User,
    // `url` is required, otherwise Backbone will throw an error
    url : '/something'
  });
  var userList = new UserList();

  var bob = userList.create({
    students : [ { 
      name:'bob', 
      grade : 'a', 
      school : '123'
     } ],
    interest : { music : 'no' }
  });

  console.log( bob.get('students')[0].grade );

http://jsbin.com/elusey - 点击“编辑”,查看代码和控制台。你应该看到“a”作为输出。

你实际上可以简化模型(正如我所说,上面描述的数据结构对单个用户来说没有意义):

var User = Backbone.Model.extend({
    defaults : {   
        name : "abc",
        grade : "A",
        school : "xyz"
        interests : ["music"]
    }
});

<强> UPD 即可。实际上,您不必使用create集合方法来将模型添加到集合中。当你创建一个集合的实例时,你可以传入一个模型数组,就像这样(注意差异,在你的代码中你将一个对象传递给一个集合,但实际上你需要传递一个数组,即使有一个对象在其中):

var userList = new UserList([{
    name:'bob', 
    grade : 'A', 
    school : '123',
    interests : [ "music" ]
  },{
    name:'george', 
    grade : 'B', 
    school : '321',
    interests : [ "drugs" ]
  }]);

你可以在这里找到使用这种方式添加模型的工作示例(不要忘记查看控制台):http://jsbin.com/elusey/2/edit

答案 1 :(得分:1)

您确定用户“有很多”学生吗?这没有多大意义。但是,如果是这种情况,则应为学生模型和学生集合添加定义。比,您的用户模型应该包含学生集合,以及set()方法中的一些逻辑,以将学生数组转换为学生集合。如果您想更优雅地处理嵌套在模型下的集合/模型,请查看Backbone-relational