Я использую шаблон 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. Я действительно смущен. Не могли бы вы указать мне в правильном направлении?
С наилучшими пожеланиями,
Евгений
Hi al_amanat, извините за позднее Быстродействие - я был болен. Я попробовал то, что вы предлагали раньше. Проблема в том, что функция canActivate() не читается вообще. Это просто полностью игнорируется. – Eugene