骨干客户端路由器:如何优化

时间:2014-02-03 15:20:41

标签: javascript backbone.js backbone-routing

我有以下路线配置:

routes: {
    '': 'landing_page', 
    ':show_page': 'show_page', 
    '*actions': 'defaultAction' 
    }, 

“显示页面”包含的功能类似于:

show_page: function(page_name){
        $.get('php/User/check_session.php', _.bind(function(status) {
            if(status == "yes"){
                switch(page_name){

                    case "home": 
                        var home_View = new Home_View(); 
                        app.views.resultView.showView(home_View); 
                        break; 

                    case "parents": 
                        var parent_View = new Parent_View(); 
                        app.views.resultView.showView(parent_View); 
                        break; 

                    case "insurers": 
                        var insurer_View = new Insurer_View(); 
                        app.views.resultView.showView(insurer_View); 
                        break; 

                    case "new_role": 
                        var new_roles_View = new New_roles_View(); 
                        app.views.resultView.showView(new_roles_View); 
                        break; 

                    case "roles_permissions": 
                        var roles_permissions_View = new Roles_permissions_View(); 
                        app.views.resultView.showView(roles_permissions_View); 
                        break; 

                    case "user_roles": 
                        var user_roles_View = new User_roles_View(); 
                        app.views.resultView.showView(user_roles_View); 
                        break; 

                    case "new_accounting": 
                        var input_accounting_View = new Input_accounting_View(); 
                        app.views.resultView.showView(input_accounting_View); 
                        break; 

                    default:
                        var home_View = new Home_View(); 
                        app.views.resultView.showView(home_View); 
                        this.navigate("/home", {trigger:true}); 
                        break; 
                };
etc... 

现在问题是我想得到类似的路线:

':show_page/:second_parameter': 'show_page_with_parameter' 

问题是我可以用条件管理所有事情(转换,或者......等等):
例如。如果父页面,则参数为parent_id。但是如果是new_role页面,那么参数是role_id。 但我已经觉得好像我弄乱了路由器的js文件。

这是正确的做事方式,还是建议我以不同的方式处理这件事?

1 个答案:

答案 0 :(得分:0)

我将摆脱switch语句并在您的路由对象中明确定义所有路由 - 它更容易理解并且一目了然地查看所有路线。

routes: {
  '': 'landingPage', 
  'home': 'home', 
  'parents': 'viewParents',
  'parents/:id': 'getParents',
  ...
  '*actions': 'defaultAction' 
}, 

除此之外,您的处理程序现在非常简单,但将来可能会发生变化。大多数人可以使用:

function setView (view, options) {
    app.views.resultView.showView(new view(options));
}

使用某种登录验证:

function isLoggedIn() {
  return $.get('php/User/check_session.php').then(function (status) {
    if (status !== 'yes')
      throw new Error('Not logged in');
  });
}

或者使用视图设置器添加登录验证:

function setAuthenticatedView (View, options) {
  return function () {
    isLoggedIn().then(function () {
      setView(View, options);
    });
  }
}

所有在一起:

permissionsView: setAuthenticatedView(Permissions_view, {}),
parentsView: setAuthenticatedView(Parents_view, {}),

通过这种方式,您可以在没有巨型switch语句的情况下扩展具有额外功能的路由,对于简单路由,您可以轻松读取源代码并查看,这些是经过身份验证的视图,并且它们只是设置了简单的骨干视图。