在以下主干脚本中,我尝试在视图点击事件中更改集合。
var StudentView = Backbone.View.extend({
initialize: function() {
console.log("create student items view");
this.collection.bind('add',this.render,this);
this.collection.bind('remove',this.render,this);
},
render : function(){
},
events :{
"click ":"select_students"
},
select_students: function(){
this.collection.reset([]);
_.each(students.models, function(m) {
if(m.get('name')=="Daniel"){
this.collection.add(m);
}
});
}
});
var students_view = new StudentView({el:$("#student_table"),collection:selected_students});
我收到此错误
我应该如何在代码中调用“this.collection”?
答案 0 :(得分:2)
您应该将select_students
更改为
select_students: function(){
var self = this;
this.collection.reset([]);
_.each(students.models, function(m) {
if(m.get('name')=="Daniel"){
self.collection.add(m);
}
});
}
问题是在JavaScript中,this
上下文在内部函数中丢失(比如传递给_.each
的函数),因此一般模式是将引用保存在该函数之外({{ 1}})然后在内部函数中使用它。
答案 1 :(得分:0)
不是使用下划线的each()函数,而是可以直接迭代骨干集合,并且可以使用上下文来定义'this'变量引用的内容(作为第二个参数传递给下面的每个)。
所以最好的方法是:
select_students: function(){
this.collection.reset([]);
students.each(function(m) {
if(m.get('name')=="Daniel"){
this.collection.add(m);
}
}, this);
}
答案 2 :(得分:0)
您可以使用Backbone的集合filter方法来避免使用引用。
select_students: function () {
this.collection.reset(students.filter(function (student) {
return student.get('name') == 'Daniel';
});
}