Javascript $(this.el).find()在事件处理程序中工作,而不是在初始化函数(backbone.js)中工作
我正在使用backbone.js创建一个视图,其中包含一个类似于的按钮。此视图的模型包含属性Javascript $(this.el).find()在事件处理程序中工作,而不是在初始化函数(backbone.js)中工作,javascript,jquery,backbone.js,underscore.js,Javascript,Jquery,Backbone.js,Underscore.js,我正在使用backbone.js创建一个视图,其中包含一个类似于的按钮。此视图的模型包含属性is_Like,如果其值为1,则调用的函数setStateLike将更改Like按钮的样式 问题:我无法使用函数中的this.setStateLike()选择按钮。这样做只会返回一个[]。但是,当我将this.setStateLike定义为click事件处理程序时,选择按钮是有效的!奇怪的是initialize中调用的this.setStateLike()能够选择$(this.el),但不能选择$(thi
is_Like
,如果其值为1
,则调用的函数setStateLike
将更改Like
按钮的样式
问题:我无法使用函数中的this.setStateLike()
选择按钮。这样做只会返回一个[]
。但是,当我将this.setStateLike
定义为click事件处理程序时,选择按钮是有效的!奇怪的是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');
}
}
});
如果您的脚本位于主体HTML之前,并且如果立即调用initialize
函数,那么这就是您的问题:DOM尚未实际构建,因此无法选择任何元素。在
末尾运行脚本,或者使用。使用this.$el
而不是$(this.el)
保存键入注意@Austin建议先分配this.$el
,然后再使用它,而不是$(this.el)
。这样做的最佳原因不是为了节省击键次数,而是为了提高性能:将DOM元素包装到jQuery对象中需要付出努力,最好只做一次,而不是反复进行。我很确定Backbone.View定义了this.$el
和this.el
,不需要赋值。这是否意味着我需要调用$(this.el)
一次来创建缓存,然后再使用this.$el
?或者当视图由backbone.js呈现时,this.el
已经被创建为$(this.el)
的缓存了吗?这个问题可能只是我的问题,而不是整个语句$(this.el).find(''like.photo_btn').addClass('photo_btn_active').attr('id,'distributed')代码>看起来完全错了。如果您可以通过id来标识元素(并且id在DOM中应该是唯一的),那么为什么还要麻烦使用前导呢。这是一个重复元素,您应该使用一个类而不是id,或者它是唯一的且$('#like.photo_btn').addClass('photo_btn_active').attr('id','inspect')代码>将正确地对其进行寻址。我还质疑更改元素的id,这是非常规的,可能会造成混乱在this.render()的结尾处添加code>到,现在就可以使用了。