我正在使用HotTowel SPA模板(使用Durandal 2.0),我正在实施基于用户凭据的导航。例如,如果用户是特定域组的成员,则允许他查看所有视图,如果不是,则只能看到一个视图,等等。
为此,我根据对服务器的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&#34 )。 我阅读了文档,它说我可以使用canActivate()函数,比如
function canActivateItem()
{
if (preMenuParameter == 0)
return { redirect: 'http://cnn.com' };
return true;
}
我的问题是我无法理解为了被调用而应该设置此功能的位置?它不在router.js中,也不在activate.js中。我真的很困惑。你能指出我正确的方向吗?
致以最诚挚的问候,
尤金
答案 0 :(得分:0)
您必须在shell.js中定义canActivate
方法。例如:
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