3

私は次のバックボーンビューを持っています:

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');
        }
    }
});

私が抱えている問題は、次のことを行う場合です:$('#username')。focus(); :レンダリングでは、:usernameFocus:イベントがまだアタッチされていません。私が考えることができる解決策は2つだけです。

  1. setTimeoutを使用する-このオプションは技術的には機能しますが、実際のオプションとは見なしません
  2. レンダリングでイベントを手動で適用する-これを行うと、Backboneが提供するイベントシステムが完全にバイパスされますが、これは奇妙に思えます。

Backboneは、すべてのイベントが適用された後にjQueryコードを実行する方法を提供しますか?

4

2 に答える 2

1

私は実際にそのコードをビューのrenderメソッドから実際にビューを生成するルーターのメソッドに移動しただけで、とにかくそれがより良い場所のようです。

于 2012-04-19T10:18:56.807 に答える
1

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

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

初期化して、必要な効果を取得します。

于 2012-04-19T13:44:43.987 に答える