Backbone には 2 つのビューがあります。登録ビューとログイン ビュー。
ログインビュー
define(['text!templates/login.html'], function(loginTemplate) {
var loginView = Backbone.View.extend({
el: $('#content'),
events: {
"submit form": "login"
},
login: function(e) {
e.preventDefault();
$.post('/user/login', {
email: $('input.login-email').val(),
password: $('input.login-password').val()
}, function(data) {
console.log(data);
}).error(function(){
$("#error").text('Unable to login.');
$("#error").slideDown();
});
},
render: function() {
this.$el.html(loginTemplate);
}
});
return new loginView;
});
ビューを登録する
define(['text!templates/register.html'], function(registerTemplate) {
var registerView = Backbone.View.extend({
el: $('#content'),
events: {
"submit form": "register"
},
register: function(e) {
e.preventDefault();
$.post('/user/register', {
emailaddress: $("input.email").val(),
password: $("input.password").val()
}, function(data, textStatus, jqXHR) {
console.log(data);
});
},
render: function() {
this.$el.html(registerTemplate);
this.delegateEvents();
}
});
return new registerView;
});
そして、別のイベントに切り替える前に、 currentView からのイベントの委任を解除します。しかし、バックボーン ビュー モデルは、そのコンストラクターで delegateEvent() 関数を呼び出します。そのため、ブラウザーでページを開いてログイン ビューを取得し、フォームを送信する場合、両方のビューからのイベントが委任されるため、2 つの要求があります。コンストラクターで delegateEvent 関数を防ぐことはできますか? IDを使用できることはわかっていますが、「混乱」は好きではありません。アクティブなビューからのイベントのみが必要です。
どうもありがとう。
編集:これが私のルーターです。おそらくそれが私の「バグ」の原因です。
define(['views/register', 'views/login'], function(RegisterView, LoginView) {
var TestRouter = Backbone.Router.extend({
currentView: null,
routes: {
"login": "login",
"register": "register"
},
changeView: function(view) {
if ( this.currentView != null ) {
this.currentView.undelegateEvents();
}
this.currentView = view;
this.currentView.render();
},
login: function() {
this.changeView(LoginView);
},
register: function() {
this.changeView(RegisterView);
}
});
return new TestRouter;
});