Backbone.js 主干网查看在路由中重复触发的事件

Backbone.js 主干网查看在路由中重复触发的事件,backbone.js,requirejs,backbone-views,backbone-events,backbone-routing,Backbone.js,Requirejs,Backbone Views,Backbone Events,Backbone Routing,我有一个包含路由器文件和一些视图的应用程序,我还使用它向路由添加视图,并向视图添加模板。这是我的密码: routes.js var AppRouter = Backbone.Router.extend({ routes: { "": "getLogin", "login": "getLogin", "register": "getRegister", "forget-password": "getForgetPassword" }, getLogin: funct

我有一个包含路由器文件和一些视图的应用程序,我还使用它向路由添加视图,并向视图添加模板。这是我的密码:

routes.js

var AppRouter = Backbone.Router.extend({
routes: {
    "": "getLogin",
    "login": "getLogin",
    "register": "getRegister",
    "forget-password": "getForgetPassword"
},
getLogin: function() {
    require(['views/auth/loginView'], function(view) {
        view = new this.LoginView();
    });
},
getRegister: function() {
    require(['views/auth/registerView'], function() {
        view = new this.RegisterView();
    });
},
getForgetPassword: function() {
    require(['views/auth/forgetPasswordView'], function() {
        view = new this.ForgetPasswordView();
    });
},
});

var route = new AppRouter();
Backbone.history.start();
var LoginView = Backbone.View.extend({
el: '#wrapper',
initialize: function() {
    NProgress.start();
    this.render();
},
render: function() {
    require(['text!partials/auth/login.html'], function(t) {
        var json = { title: 'title', formName: 'frmLogin' };
        var template = _.template(t);
        $('#wrapper').html(template(json));
    });
    NProgress.done();
},
events: {
    "click #btnLogin": "login"
},
login: function(e) {
    e.preventDefault();
    alert('some message');
}
});
loginView.js

var AppRouter = Backbone.Router.extend({
routes: {
    "": "getLogin",
    "login": "getLogin",
    "register": "getRegister",
    "forget-password": "getForgetPassword"
},
getLogin: function() {
    require(['views/auth/loginView'], function(view) {
        view = new this.LoginView();
    });
},
getRegister: function() {
    require(['views/auth/registerView'], function() {
        view = new this.RegisterView();
    });
},
getForgetPassword: function() {
    require(['views/auth/forgetPasswordView'], function() {
        view = new this.ForgetPasswordView();
    });
},
});

var route = new AppRouter();
Backbone.history.start();
var LoginView = Backbone.View.extend({
el: '#wrapper',
initialize: function() {
    NProgress.start();
    this.render();
},
render: function() {
    require(['text!partials/auth/login.html'], function(t) {
        var json = { title: 'title', formName: 'frmLogin' };
        var template = _.template(t);
        $('#wrapper').html(template(json));
    });
    NProgress.done();
},
events: {
    "click #btnLogin": "login"
},
login: function(e) {
    e.preventDefault();
    alert('some message');
}
});
另外,
registerView.js
forgetPasswordView.js
loginView.js
类似

现在当我多次更改路由并点击
#btnLogn
时,它会触发
警报(“某些消息”)功能多次

您是否尝试过视图中有关路线更改的事件

您可以覆盖
AppRouter
中的
route
方法(),并在渲染每个路由之前运行它

route: function(route, name, callback) {
    view.undelegateEvents();
    return Backbone.Router.prototype.route.apply(this, arguments);
}

注意:只是一个想法,没有用你的代码测试

你有两个路由器方法中的意外全局
视图
s。您正在创建绑定到
#wrapper
(在我看来这是个坏主意)的视图,而不是让视图创建并拥有自己的
el
s。我看不到任何
view.remove()
调用,这样您就不用费心破坏视图了,而且还存在内存泄漏和僵尸视图。修复所有这些,然后再试一次。@muistoshort我认为你是对的。。。!让我试试。@muistoshort你有什么建议?你能帮我吗?@543310你应该保留对已创建视图的引用。在创建另一个之前,请先删除现有的。。。