2012-04-19 42 views
3

我有如下看法骨幹適用jQuery代碼:當在一個骨幹視圖

core.views.Login = Backbone.View.extend(
{ 
    el: '#main-content-wrapper', 

    events: 
    { 
     'focus #username': 'usernameFocus', 
     'blur #username': 'usernameBlur' 
    }, 

    initialize: function() 
    { 
     this.render(); 
    }, 

    render: function() 
    { 
     var html = unlocked.renderTemplate('login', 'core'); 
     this.$el.empty().html(html); 

     $('#username').focus(); 

     return this; 
    }, 

    usernameFocus: function(event) 
    { 
     console.log('focus'); 
     if($(event.target).val() == 'Username') 
     { 
      $(event.target).val(''); 
     } 
    }, 

    usernameBlur: function(event) 
    { 
     if($(event.target).val() == '') 
     { 
      $(event.target).val('Username'); 
     } 
    } 
}); 

我的問題是,當我這樣做:$(「#用戶名」)專注(); :在渲染中是:usernameFocus:事件尚未附加。我只能想到兩種解決方案。

  1. 使用的setTimeout - 在該選項在技術上的工作,我不認爲這是一個真正的選擇
  2. 手動應用中呈現的事件 - 這樣做將完全繞過事件系統,骨幹網提供了似乎只是奇怪的。

Backbone爲我提供了一種在所有事件應用後運行jQuery代碼的方法嗎?

回答

1

在焦點設置代碼之前讓事件處理程序映射到事件的一種簡單方法是調用與Backbone本身提供的相同的綁定代碼。你應該可以撥打:

this.delegateEvents(); 
this.render(); 

在你初始化並得到你想要的效果。

+0

這也適用,並且更好地回答我的原始問題,謝謝。 – ryanzec 2012-04-19 21:16:51

1

我實際上只是將該代碼從視圖的render方法中移出,並進入路由器的實際生成視圖的方法,這似乎是一個更好的地方。

+0

在這種情況下,這是一個很好的答案,因爲您可能有多個視圖,並且單個視圖之外的某個內容可能應該是哪個人應該關注的仲裁者。但是,這並不能回答你原來的問題,所以我想我會在下面快速開一下。 – 2012-04-19 13:41:58