2012-04-19 7 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:イベントがまだ添付されていないということです。私が考えることができるソリューションは2つだけです。

  1. setTimeoutを使用 - このオプションは、技術的に働くだろうが、私はレンダリング中にイベントを適用し、手動での現実的な選択肢
  2. 考慮されていない - これを行うと、完全にバックボーンがちょうど思われる提供イベントシステムをバイパスます奇妙な。

すべてのイベントが適用された後、バックボーンはjQueryコードを実行できますか?

答えて

1

フォーカス設定コードの前にイベントにマップされたイベントハンドラを取得する簡単な方法の1つは、Backbone自身が提供する同じバインディングコードを呼び出すことです。

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

で電話をして、必要な効果を得ることができます。

+0

これも機能し、元の質問にもっとうまく答えます。 – ryanzec

1

私は実際には、ビューのレンダリングメソッドから、ビューを実際に生成するルータのメソッドにそのコードを移動しましたが、それはとにかくより良い場所と思われます。

+0

これは、いくつかのビューがあり、個々のビューの外にあるものが、どちらが焦点を当てるべきかのアービターであるべきであるため、この場合には良い答えです。しかし、それはあなたの元の質問に答えることはできませんので、私は下の簡単な説明をします。 –

関連する問題