【问题标题】:Durandal: how to call CanActivate() methodDurandal:如何调用 CanActivate() 方法
【发布时间】:2016-10-04 15:46:55
【问题描述】:

我正在使用 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”)。 我阅读了文档,它说我可以使用 canActivate() 函数,比如

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

我的问题是我不明白应该在哪里设置这个函数才能被调用?它不在 router.js 中,也不在 activate.js 中。我真的很困惑。你能指出我正确的方向吗?

最好的问候,

尤金

【问题讨论】:

    标签: javascript single-page-application durandal-2.0 durandal-navigation


    【解决方案1】:

    你必须在你的 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

    【讨论】:

    • 嗨 al_amanat,抱歉回复晚了 - 我病了。我试过你之前的建议。问题是 canActivate() 函数根本没有被读取。它完全被忽略了。
    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2015-07-01
    • 2021-04-09
    • 2014-12-10
    相关资源
    最近更新 更多