Backbone / javascript - 被'this'关键字搞糊涂了

时间:2013-05-24 18:39:33

标签: javascript backbone.js this

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

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

我收到此错误enter image description here

我应该如何在代码中调用“this.collection”?

3 个答案:

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