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 的代码。

编辑:
如果你放一个选择器,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>属性绑定到表单的模板,而不仅仅是主干视图,
  • 你会明确捕获正确的提交吗?
  • 你能支持多个提交事件吗(如果一个模板有两个表单)。
于 2015-04-06T04:06:43.603 回答
0

也许当您绑定表单提交事件时,只有提交表单才会触发“提交”事件。您可以添加以下代码并重试。

$('#id').submit(function(ev) {

});
于 2017-04-19T15:23:22.850 回答