0

在以下主干脚本中,我尝试更改视图单击事件中的集合。

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”?

4

3 回答 3

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的那个),所以一般的模式是在那个 () 之外保存一个引用self,然后在内部函数中使用它。

于 2013-05-24T18:43:48.640 回答
0

您可以完全避免使用引用,利用 Backbone 的集合过滤器方法。

select_students: function () {
    this.collection.reset(students.filter(function (student) {
        return student.get('name') == 'Daniel';
    });
}
于 2013-12-21T18:31:09.017 回答
0

无需使用下划线的 each() 函数,可以直接迭代主干集合,并且可以使用上下文来定义“this”变量所指的内容(作为第二个参数传递给下面的每个)。

所以最好的方法是:

select_students: function(){
    this.collection.reset([]);
    students.each(function(m) {
        if(m.get('name')=="Daniel"){
            this.collection.add(m);
        }
    }, this);                         
}
于 2013-12-21T17:40:15.800 回答