2012-07-22 16 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

相關問題