我正在尝试使用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
。我如何才能在count
内question collection
引用此内容。我计划在我的应用程序中使用许多辅助函数。所以需要一些坚实的方法来做到这一点。
感谢。
答案 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()
});
}