2014-02-03 4 views
0

Я следующая конфигурация маршрута:Backbone клиент маршрутизатор: как оптимизировать

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' 

Дело в том, что я мог бы управлять всем с условием ns (переключатель, или если ... затем):
Например. Если родительская страница, то параметр parent_id. Но если new_role page, то параметр role_id. Но я уже чувствую, как будто я забиваю файл ros js.

Правильно ли это делать вещи, или вы бы посоветовали мне обращаться с этим по-другому?

ответ

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

+1

Благодарим за полезный совет, имеет смысл перестроить мою архитектуру в соответствии с тем, что вы предлагаете. Я не был уверен в том, нужно ли указывать пути явно или нет, но, похоже, действительно логично, что будет более четкой разработка дополнительной маршрутизации для каждого пункта меню. Спасибо! – Trace

+0

np, рад, что это помогло! – jsantell

Смежные вопросы