15

次のコードを使用してビューを作成しています。

LoginForm = Backbone.View.extend({

    tagName :"form"
    ,id : "login-form"
    ,className :"navbar-form"
    ,initialize: function () {
            this.model = new StackMob.User();
            this.render();
    }
    ,render: function () {
            $(this.el).html(this.template());
            return this;
    }
    ,events : {
            "change" : "change"
            ,"submit #login-form" : "login"
    }
    ,login : function( event) {
            event.preventDefault();
            var self = this;
            this.model.login(true, {
                    success: function( model) {
                            app.alertSuccess( "User logged in");
                            self.render();
                    }
                    ,error: function( model, response) {
                            app.alertError("Could not login  user: " + response.error_description);
                    }
            });
            event.currentTarget.checkValidity();
            return false;
    }
// rest of code

そしてテンプレート:

<input name="username" class="span2" type="email" placeholder="Email" required >
<input name="password" class="span2" type="password" placeholder="Password" required >
<button id="login-button" type="submit" class="btn">Sign in</button>

ボタンにバインドすると、ログイン機能が呼び出されます。フォーム送信イベントにバインドすると、ログイン関数が呼び出されません。id & form タグがテンプレートの一部である場合、バインドするフォームを取得することもできますが、これはここでやりたいことではありません。

この場合、フォーム送信時にバインドするにはどうすればよいですか?

4

3 に答える 3

37
"submit #login-form" : "login"

Backbone は子孫の中からのみこの ID を検索すると思います。したがって、独自のビュー要素と一致することはありません。なぜあなただ​​けを使用しないのですか:

"submit": "login"

あなたが変化のためにしたように。
念のため、Backbone のコードを確認します。

編集:
セレクターを配置すると、バックボーンが呼び出されます

this.$el.on(event, selector, method);

それ以外の

this.$el.on(event, method);

また、jQuery の on メソッドは代わりに、要素自体を除外して、要素の子孫のみにセレクターを適用します。

于 2013-03-28T15:32:08.063 に答える
3

バックボーンの使い方が間違っています。では、どうしたいのかというと、

template: my_template_string,
render: function () {
    this.el.innerHTML = this.template();
},
events: {
    "submit #login-form": function (event) {}
}

this.templateに設定されている場所

<form id="login-form" class="navbar-form">
    <input name="username" class="span2" type="email" placeholder="Email" required >
    <input name="password" class="span2" type="password" placeholder="Password" required >
    <button id="login-button" type="submit" class="btn">Sign in</button>
</form>

そして、それは理にかなっているだけではありませんか?id と classname を入力要素から分離する必要があるのはなぜですか? ところで、あなたはまだ裸のキャッチオールを行うことができますがsubmit、私の方法でのみ、

  • <form>クラスと属性は<form>、バックボーン ビューだけでなく、フォームのテンプレートに結び付けられます。
  • 適切な送信を明示的にキャプチャするか、
  • 複数の送信イベントをサポートできますか (1 つのテンプレートに 2 つのフォームがある場合)。
于 2015-04-06T04:06:43.603 に答える