我使用backbone.js创建包含Like
按钮的视图。此视图的模型包含属性is_liked
,如果其值为1
,则调用的函数setStateLike
将更改Like
按钮的样式。
问题:我不能在initialize
函数中使用this.setStateLike()
来选择按钮。这样做只是返回[]
。但是,当我将this.setStateLike
定义为点击事件处理程序时,选择该按钮的作用!陌生人的事情是,在initialize
内调用的this.setStateLike()
可以选择$(this.el)
,但不是$(this.el).find()
!
任何想法这里发生了什么,它如何解决?谢谢!
PhotoListItemView = Backbone.View.extend({
tagName: 'div',
className: 'photo_box',
events: {
'click': 'setStateLike'
},
initialize: function() {
this.setStateLike();
},
render: function() {
$(this.el).html(this.template(this.model.toJSON()));
return this;
},
setStateLike: function() {
console.log($(this.el).find('#like')); // returns []
if(this.model.get('is_liked')) {
console.log($(this.el)); // returns correctly
console.log($(this.el).find('#like')); // returns []
// Change icon to Active state
$(this.el).find('#like.photo_btn').addClass('photo_btn_active').attr('id', 'unlike');
}
}
});
使用'this。$ el'代替'$(this.el)'来保存输入 – Austin 2012-07-22 03:40:37
请注意,@奥斯汀建议*先分配*'this。$ el',然后稍后使用它代替$ this.el)'。这样做的最好理由不是为了节省击键,而是为了提高性能:将DOM元素包装到jQuery对象中需要付出努力,最好是一次而不是一次又一次地完成。 – Matchu 2012-07-22 03:44:13
我很确定Backbone.View定义了'this。$ el'和'this.el',而不需要赋值。 – Austin 2012-07-22 03:54:29