2012-07-22 19 views
2

我使用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'); 
     } 
    } 
}); 
+0

使用'this。$ el'代替'$(this.el)'来保存输入 – Austin 2012-07-22 03:40:37

+0

请注意,@奥斯汀建议*先分配*'this。$ el',然后稍后使用它代替$ this.el)'。这样做的最好理由不是为了节省击键,而是为了提高性能:将DOM元素包装到jQuery对象中需要付出努力,最好是一次而不是一次又一次地完成。 – Matchu 2012-07-22 03:44:13

+0

我很确定Backbone.View定义了'this。$ el'和'this.el',而不需要赋值。 – Austin 2012-07-22 03:54:29

回答

1

如果你的脚本来了大部分的身体HTML之前,如果initialize功能被立即调用,那是你的问题:DOM实际上没有建呢,所以没有元素可以选择。在</body>末尾运行脚本,或使用jQuery's DOM-ready handler

+0

感谢您的建议,我将'this.setStateLike();'移到'this.render()'结尾后面,它现在可以工作。 – Nyxynyx 2012-07-22 03:44:00

相关问题