拦截路由并在ui-router在AngularJS中响应之前修改它

时间:2015-06-02 06:23:03

标签: angularjs angular-ui-router

我在移动AngularJS网站上使用HTML5 pushstate。当有人点击桌面版时,他们会被重定向到移动网站。有时,URL具有桌面站点使用的哈希值。额外的#导致了消化循环问题。

我想在UI路由器甚至有机会对其进行操作之前修改路由字符串。给出:

http://www2.health.com.au/product/basic/#?blah我只希望UI路由器读取路径/product/basic/

我尝试将一条规则添加到路由提供程序(docs),检查'#?'并拆分字符串 - 但这似乎没有效果:

$urlRouterProvider.rule(function ($injector, $location){
  var path = $location.url();
  debugger;
  if(path[path.length - 1].indexOf('#?')){
    var splitpath = path.split('#?');
    $location.replace().path(splitpath[0]);
    return splitpath[0];
  }
});

路线最终会像这样:http://www2.health.com.au/product/basic/#%252525252525252525252525252525252525252525252525252525252525252525252.......

错误10 $digest() iterations reached

我的印象是规则拦截路由,如果可能的话更改它,然后通过固定路由为ui-router处理。任何人都可以放弃任何光明吗?

1 个答案:

答案 0 :(得分:0)

我对这个解决方案并不是特别满意,但我最终还是做了一个手动引导程序,并且有一个FREAKIN SETTIMEOUT!没有它,angular.bootstrap()比赛window.location = ...并赢得令人难以置信的胜利。

angular.element(document).ready(function(){
  var loc = window.location.href,
    index = loc.indexOf('#?');

    if(index > 0){
      alert('needsfix');
      window.location = loc.substring(0, index);
      setTimeout(function() {
        angular.bootstrap(document, ['health3App']);
      }, 500);

    } else {
      angular.bootstrap(document, ['health3App']);
    }

})