0

Я использую шаблон SPA HotTowel (с Durandal 2.0), и я реализую навигацию на основе учетных данных пользователя. Например, если пользователь является членом определенной группы домена, ему разрешено видеть все представления, если нет, только один вид и т. Д.Durandal: как вызвать метод CanActivate()

Для этого я создаю маршруты для перехода к маршрутизатору на основе результата вызова Ajax на сервер.

Вот мой shell.js сценарий:

define(['durandal/system', 'plugins/router', 'services/logger', 'services/config'], 
function (system, router, logger, config) { 

    var accessParameter; 
    var URLPrefix = config.URLPrefix;  
    var getMenuJsonURL = URLPrefix ; 

    var shell = {    
     activate: activate, 
     router: router 
    }; 

    return shell; 


    //#region Internal Methods 
    function activate() { 
     return boot(); 
    } 

    function boot() { 
     function callMenuParameter() { 
      var httpRequest = new XMLHttpRequest(); 
      httpRequest.open('GET', getMenuJsonURL,false); //"false" states "async:false". Very important! 
      httpRequest.send(); 
      return httpRequest.responseText; 
     } 

     var result = callMenuParameter(); 
     var parsedData = JSON.parse(result); 
     var menuParameter = parsedData.menuNbr; //it is the parameter that I need. 
     log('Entry form Loaded', null, true); 

     router.on('router:route:not-found', function (fragment) { 
      logError('No Route Found', fragment, true); 
     }); 

     var routesToPass; 

     if (menuParameter == 1) 
      routesToPass = [ 

      { route: '', moduleId: 'bstrp', title: 'Statement', nav: 1 }, 

      ]; 
     else if(menuParameter == 2) 
      routesToPass = [ 

      { route: '', moduleId: 'home', title: menuParameter, nav: 1 }, 
      { route: 'bstrp', moduleId: 'bstrp', title: 'Statement', nav: 4 }]; 
     else 

      routesToPass = [ 

      { route: '', moduleId: 'home', title: 'SomethingEsle', nav: 1 }, 
      { route: 'bstrp', moduleId: 'bstrp', title: 'Statement', nav: 4 }]; 

     return router.makeRelative({ moduleId: 'viewmodels' }) // router will look here for viewmodels by convention 

      .map(routesToPass) 
      .buildNavigationModel() // Finds all nav routes and readies them 
      .activate();   // Activate the router 


    } 

    function log(msg, data, showToast) { 
     logger.log(msg, data, system.getModuleId(shell), showToast); 
    } 

    function logError(msg, data, showToast) { 
     logger.logError(msg, data, system.getModuleId(shell), showToast); 
    } 
    //#endregion 
}); 

Это работает. Однако я также хочу перенаправить пользователя от приложения, если он там не принадлежит (параметр из вызова ajax возвращает «0»). я прочитал документацию, и он говорит, что можно использовать функцию canActivate(), что-то вроде

function canActivateItem() 
{ 
    if (preMenuParameter == 0) 
    return { redirect: 'http://cnn.com' }; 
    return true; 
} 

Моя проблема я не могу понять, откуда эта функция должна быть установлена ​​для того, чтобы получить под названием? Это не в router.js, а не в activate.js. Я действительно смущен. Не могли бы вы указать мне в правильном направлении?

С наилучшими пожеланиями,

Евгений

ответ

0

Вы должны определить canActivate метод в shell.js. Например:

define(['durandal/system', 'plugins/router', 'services/logger', 'services/config'], 
    function (system, router, logger, config) { 
     function activate() { 
      //... some code there 
     } 

     function canActivate() { 

      var result = callMenuParameter(); 
      var parsedData = JSON.parse(result); 
      var menuParameter = parsedData.menuNbr; 
      if (menuParameter == 0) { 
       window.location.href = 'http://somesite.com'; 
       return false; 
      } 

      // I suggest to place router initialization code here... 

      return true; 
     } 

     var shell = { 
      activate: activate, 
      canActivate: canActivate, 
      router: router 
     }; 

     return shell; 
    } 

Вы можете посмотреть статью ниже для получения дополнительной информации и некоторых технических деталей: http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks.html

+0

Hi al_amanat, извините за позднее Быстродействие - я был болен. Я попробовал то, что вы предлагали раньше. Проблема в том, что функция canActivate() не читается вообще. Это просто полностью игнорируется. – Eugene

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