将'this'引用传递给Backbone函数

时间:2013-01-20 02:17:41

标签: backbone.js requirejs handlebars.js

我正在尝试使用require.js,AMD和用于模板的把手构建Backbone应用程序。 这是我的索引视图的代码。

define([
  'jquery',
  'underscore',
  'backbone',
  'handlebars',
  'collection/questions',
  'helpers'
], function($, _, Backbone, Handlebars, QuestionsCollection, Helpers){
// Main Index View
var IndexView = Backbone.View.extend({
    el: "#content",
    template: Helpers.template('index'),

    initialize: function(){
        this.questions = new QuestionsCollection();
        this.questions.on('sync', this.render, this);
        this.questions.fetch();
    },

    render: function(){
        this.$el.html(this.template(this));
        this.questions.each(this.addQuestion, this);
        return this;
    },

    addQuestion: function(question){
        var view = new IndexView.Question({ model: question });
        view.render();
    },

    count: function(){
        console.log(this);
        return this.questions.length;
    }
});

// Individual Question View
IndexView.Question = Backbone.View.extend({
    render: function(){
        // console.log(this.model);
    }
});

return IndexView;
}); 

这里的一切都正在进行中。但是现在我想要一个辅助函数计数,它将返回集合中的模型数量。这样我就可以在{{count}}中使用handle bar template来打印类似的内容。 'There are 8 questions'。但是我的范围有问题。

count内部,此功能指的是window,但不是collection。我如何才能在countquestion collection引用此内容。我计划在我的应用程序中使用许多辅助函数。所以需要一些坚实的方法来做到这一点。

感谢。

1 个答案:

答案 0 :(得分:4)

您可以使用Underscore.js中的“bindAll”功能,如下所示:

initialize: function () {
    _.bindAll(this, 'count');
    // your initialize code
}

基本上,它使用类似于以下的代码替换您的'count'方法:

var thisReference = this;
var originalCount = this.count;

this.count = function () {
    originalCount.apply(thisReference, Array.prototype.slice.call(arguments));
};

即,它只保存原始的'this'引用,并在调用'count'方法时传递它。

今天,浏览器内置了对这个习惯用法的支持(参见Function.bind)。

尽管如此,在这种情况下,最好将count作为模板变量传递:

render: function () {
    this.template({
        count: this.count()
    });
}