我有以下代码:
var GoalPanelView = Backbone.View.extend({
// Bind to the goal panel DOM element
el: $("#sidebar-goals"),
// Initialize the collection
initialize: function() {
this.collection = Goals;
this.collection.bind('add', this.appendItem);
},
// Create a new goal when a user presses enter in the enter goal input
createOnEnter: function(e) {
if (e.keyCode != 13) return;
this.addItem();
//Goals.create(this.newAttributes());
},
// Add the goal item to the goal list
addItem: function() {
var goal = new Goal();
goal.set(this.newAttributes());
var goalsElem = this.el;
this.collection.add(goal);
$(this.el).children("#enter-goal").val('');
},
// Append DOM element to the parent el
appendItem: function(item) {
var goalView = new GoalView({
model: item,
});
$(this.elem).append(goalView.render().el);
}
});
我的问题出在appendItem
函数内部。当我在this
函数中使用appendItem
时,我认为它认为this
指的是this.collection
而不是GoalPanelView
。如何让this
引用GoalPanelView
而不是collection
?我试图将另一个变量传递到appendItem
函数中,该函数保存this.elem
的内容,但它似乎不起作用。
有一件事是我将appendItem
函数移动到collection
并将初始化更改为绑定到this.collection.bind('add', appendItem);
,但我不想放view
填入collection
逻辑。
答案 0 :(得分:6)
您可以在绑定事件处理程序时添加范围,如下所示:
this.collection.bind('add', this.appendItem, this);
范围在处理程序中设置this
的值。在你的情况下,当前对象。
编辑: Javascript Garden有一个很好的解释,为什么this.appendItem
实际上不包含函数本身的范围,它只是一个函数指针,而不是方法指针。 Javascript的一个怪癖..
答案 1 :(得分:2)
要更新(从Backbone 0.9.2开始),正确的方法是:
initialize: function() {
this.collection.on("add", this.appendItem, this);
...
}
根据您的使用情况,您可能还需要考虑:
initialize: function() {
this.listenTo(this.collection, "add", this.appendItem);
...
}
答案 2 :(得分:0)
您还可以在_.bindAll
方法中使用下划线的initialize
功能:
initialize: function() {
_.bindAll(this);
this.collection = Goals;
this.collection.bind('add', this.appendItem);
}
现在对GoalPanelView
上的任何方法(例如appendItem
)的任何调用都将作为范围,以便对this
的引用引用GoalPanelView
实例。
如果您不希望范围GoalPanelView