来自$ routeChangeStart的URL在angularjs路由中的params

das*_*boe 7 angularjs angularjs-routing

怎么可能URL从路由参数中获取哈希片段$routeChangeStart.

$scope.$on('$routeChangeStart', function (event, next, current) {
  // trying to get the url hash fragment from <next> param here
  // e.g. to_url_function(next) -> '/my_path/1'
});
Run Code Online (Sandbox Code Playgroud)

接收URL hash片段很容易使用,$locationChangeStart但这对我来说不是一个选择.

小智 6

dasboe:我想我正在回答你的问题.

我在$ routeChangeStart事件处理程序中有一个带有身份验证/授权检查的应用程序.如果未经过身份验证,我会向用户提供模态登录页面.我想要一个成功的登录将它们发送到它们的原始目的地($ routeChangeStart的美丽是它将再次运行并在成功登录后检查授权).我在注入模态登录控制器的用户会话服务中保存了从下一个构建的路径.

这是事件处理程序

//before each route change, check if the user is logged in
//and authorized to move onto the next route
$rootScope.$on('$routeChangeStart', function (event, next, prev) {
    if (next !== undefined) {
        if ('data' in next) {
            if ('authorizedRoles' in next.data) {
                var authorizedRoles = next.data.authorizedRoles;
                if (!SessionService.isAuthorized(authorizedRoles)) {
                    event.preventDefault();
                    SessionService.setRedirectOnLogin(BuildPathFromRoute(next));
                    if (SessionService.isLoggedIn()) {
                        // user is not allowed
                        $rootScope.$broadcast(AUTH_EVENTS.notAuthorized);
                    } else {
                        // user is not logged in
                        $rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
                    }
                }   
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这是从下一个对象构建路径的函数

function BuildPathFromRoute(routeObj)
{
    var path = routeObj.$$route.originalPath;
    for (var property in routeObj.pathParams)
    {
        if (routeObj.pathParams.hasOwnProperty(property))
        {
            var regEx = new RegExp(":" + property, "gi");
            path = path.replace(regEx, routeObj.pathParams[property].toString());
        }
    }
    return path;
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 我并不热衷于我的$$路线依赖,但我找不到任何其他方法来做到这一点.也许我更容易错过一些东西 从长远来看,我可能会遇到麻烦.
  • preventDefault()在1.3.7之前的AngularJS版本上不起作用(请参阅在angularjs应用程序中不能为routeChangeStart工作的event.preventDefault()).
  • 标准警告:这是所有客户端并受到滥用.确保身份验证/授权在服务器端发生.
  • 下一个Route对象(来自事件处理程序)也有一个params属性.我不确定我是否应该像使用pathParams那样旋转其属性.