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

时间:2015-07-15 15:09:56

标签: 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'
});

使用URL hash轻松接收$locationChangeStart片段,但这不适合我。

3 个答案:

答案 0 :(得分:6)

dasboe:我想我已经回答了你的问题。

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

这是事件处理程序

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;
}

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

{{1}}

备注:

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

答案 1 :(得分:0)

如果您不想使用hasOwnProperty,则可以利用$$route.keys获取pathParams字段名称的名称:

function getPathFromRoute(routeObj)
{
    var path = routeObj.$$route.originalPath;
    var keys = routeObj.$$route.keys;
    var value;       
    for (var i = 0; i < keys.length; i++) {
        if(angular.isDefined(keys[i]) && angular.isDefined(keys[i].name)){
            value = routeObj.pathParams[keys[i].name];
            var regEx = new RegExp(":" + keys[i].name, "gi");
            path = path.replace(regEx, value.toString());            
        }
    }     
    return path;
}; 

答案 2 :(得分:0)

不要像之前给出的答案一样使用带有$$前缀的对象字段,因为它是AngularJS用于私有属性的前缀。使用此方法从路由获取URL(未测试):

    var buildPathFromRoute = function (route) {
    // get original route path
    var path = route.originalPath;
    // get params keys
    var keysLength = route.keys.length;
    for (var i=0; i<keysLength; i+=1) {
        var param = route.keys[i];

        // optional params postfix is '?'
        var postfix = param.optional ? '\\?' : '';

        var replaceString = ':' + param.name + postfix;
        var regex = new RegExp(replaceString, 'g');
        var paramValue = route.params[param.name].toString();

        // replace param with value
        path = path.replace(regex, paramValue);
    }

    path = path.replace(/\:\S+?\??/g, '');
    return path;
};