Как получить магистраль для привязки события отправки к форме?

Я использую следующий код для создания представления:

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 и формы является частью шаблона, а это не то, что я хочу здесь делать.

Как привязать форму к отправке в этом случае?


person Jim Barrows    schedule 28.03.2013    source источник


Ответы (3)


"submit #login-form" : "login"

Думаю, Backbone будет искать этот id только среди потомков. Таким образом, он никогда не будет соответствовать вашему собственному элементу представления. Почему бы вам просто не использовать:

"submit": "login"

Как и для сдачи.
На всякий случай проверю код Backbone.

Изменить:
Если вы поместите селектор, Backbone вызовет

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

вместо

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

А метод jQuery on вместо этого применит селектор только к потомкам элемента, исключая сам элемент.

person Loamhoof    schedule 28.03.2013
comment
Соответствующая документация скрыта внутри документации delegateEvents: отсутствие selector приводит к тому, что событие привязывается к корневой элемент представления (this.el). - person mu is too short; 28.03.2013
comment
К сожалению, это не исключает того, что он делал. Что ж, думаю, информации пока достаточно. - person Loamhoof; 28.03.2013
comment
Я надеюсь, что все прочитают мой ответ, потому что это бесполезный совет. - person Evan Carroll; 06.04.2015

Вы неправильно используете Backbone. Итак, что вы собираетесь делать,

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>

И разве это только не имеет смысла? Почему вы хотите, чтобы идентификатор и имя класса были отделены от элементов ввода? Кстати, вы все еще можете сделать голую ловушку на submit, но только в моем методе,

  • класс <form> и атрибут <form> должны быть привязаны к шаблону формы, а не только к основному представлению,
  • будете ли вы явно захватывать правильную отправку,
  • можете ли вы когда-либо поддерживать несколько событий отправки (в случае, если один шаблон имеет две формы).
person Evan Carroll    schedule 06.04.2015
comment
Вы говорите о проблеме просмотров зомби? id/tagName вообще не имеет отношения к проблеме. - person suish; 06.04.2015
comment
@suish да, я согласен, что причина, по которой я не использую тэг и className, id немного отличается. Я обслуживал их на странице и не позволял Backbone создавать их. Я удалил свои разглагольствования по этому поводу и оставил другие более применимые части ответа. Я по-прежнему советую никогда не использовать эту функцию. ;) - person Evan Carroll; 06.04.2015

Возможно, когда вы привязываетесь к событию отправки формы, только отправка формы вызовет событие «отправить». вы можете добавить код ниже и попробовать еще раз.

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

});
person suoyong    schedule 19.04.2017