试图理解Backbone.js视图之间的路由

Trying to understand Backbone.js routing betwen views

本文关键字:视图 之间 路由 js Backbone      更新时间:2023-09-26

我是一个很新的骨干,并试图了解它的概念。我试图创建一个backbone.js应用程序(与下划线模板),其中一些视图是由登录页面保护,他们也有一个注销按钮。

这个想法是,如果一个未登录的用户导航到一个特定的视图,他应该看到一个登录页面,一旦他登录被重定向到他最初试图去的视图。代码如下所示

router code

routes: {
    ""                  : "home",
    "authView"             : "authView",
},
login: function(view) {
        if(isUserLoggedIn()) {
            $('#content').html(view.el);
        } else {
            var loginView = new LoginView(view.model)
            $('#content').html(loginView.el);
            app.vent.on("login:success", function(){
                loginView.remove();
                $('#content').html(view.el);
            });
        }
    },
authView: function() {
    this.login(new authView());
}

authView

AuthView = Backbone.View.extend({
  events: {
    "click #logoutbutton": "logout"
  },
  initialize:function () {
    this.render();
  },
  render:function () {
    $(this.el).html(this.template(this.model));
    return this; 
  },
  logout:function (e) {
    e.preventDefault();
    logUserOut();
    app.router.navigate("authView", {trigger:true});
  }
});

通用登录路由保护似乎有效,但我不确定这是否是最好的方法(因为视图本身不受认证保护,只有路由)。

我的问题是,我不确定如何处理登出。这个想法是,用户被扔回登录页面,如果他再次登录,他应该被路由到他按下注销按钮时来自的同一个视图。

当前的想法是简单地召回相同的路由,以便调用login函数,但是如果导航函数试图导航到它已经在的路由,backbone似乎不会做任何事情。在这种情况下,调用view .render()方法也不是选项,因为它绕过了身份验证代码(它只在路由上)。

on如何处理骨干?我是不是把事情复杂化了?身份验证保护应该放在视图本身吗?我想了想,但找不到一个看起来不太复杂的解决方案。

我重写了路由器的execute函数,如下所示

execute: function (callback, args, routeName) {
    // ..
    if ( /* Check if user is not authenticated */ ) {
        Backbone.history.navigate("logout", {trigger: true});
        return;
    }
    if ( callback ) {
        callback.apply(this, args);
    }
}
//..
// logout route
logout: function () {
    // do the logout logic..
    // ..
    Backbone.history.navigate("login", {trigger: true});
}