从Angular JS重定向不适用于带有#'的散列的URL

时间:2013-11-08 15:11:29

标签: angularjs angularjs-routing

我正在初始化我的AngularJS应用程序的背景如下: SCRIPT5022: 10 $digest() iterations reached. Aborting! and redirecting to index.html

总结性问题

当我执行 window.location = $ scope.myReturnUrl 时,如果返回网址包含“#”,而不是重新加载页面,AngularJS会捕获网址更改并转到 .otherwise 部分路由提供程序设置,并再次加载Angular App。但是,我希望它能重定向到指定的URL。

简要介绍我如何做到这一点:

我在Bootstrap模式中加载我的AngularJS应用程序,这是我初始化的方式

var markup = '<div id="ng-app" ng-app="myapp" xmlns:ng="http://angularjs.org"><div ng-controller="MyAppAppCtrl"><div ng-view></div></div></div>';
jQuery('#works-modal').html(markup);
angular.bootstrap(jQuery('#ng-app'), ['myapp']);   
jQuery('#works-modal').modal('show');

在我的app.js中,所有模块的html5mode都设置为false:

$locationProvider.html5Mode(false)

因此,当我的应用程序初始化时,网址看起来像:

http://my-site.uk/user/dashboard.html#/mywork/find/id/9780273651

现在,在Modal对话框上有一个取消按钮,单击我通过ng-click捕获的按钮,单击时,它只是执行重定向,如

window.location = $rootScope.returnToUrl;

现在,在我的情况下,返回网址包含被点击的链接的ID,以便浏览器可以滚动到特定部分,返回网址是:

http://my-site.uk/user/dashboard.html#my-work1

我的溃败提供商配置

$routeProvider.
        when('/mywork/find/:id', {
          templateUrl: '/mywork/partials/find/find.html',
          controller: WorkCtrl
        }).
        when('/mywork/find/review/submit/:id', {
          templateUrl: '/mywork/partials/review.html',
          controller: ReviewCtrl
        }).
      otherwise({
        redirectTo: '/mywork/find/id/'+id
      });

问题

现在,当我尝试重定向到:http://my-site.uk/user/dashboard.html#my-work1时 而不是重新加载页面和滚动到指定的#ID,AngularJS正在捕获URL更改并重新加载应用程序。发生这种情况是因为,AngularJS捕获了网址更改,然后转到 .otherwise 部分路由提供程序设置,并再次加载Angular App。但是,我希望它能重定向到指定的URL。

由于历史原因,我使用html5mode(true)(在此主题中提到:SCRIPT5022: 10 $digest() iterations reached. Aborting! and redirecting to index.html

我不想从我的返回网址中删除#,因为它会破坏工作流程。有什么建议如何克服这个?

谢谢,

奸污

2 个答案:

答案 0 :(得分:0)

所以听起来您希望http://my-site.uk/user/dashboard.html#my-work1将您重定向到dashboard.html并滚动到包含id="my-work1"的元素。

您可能需要查看$anchorScrollhttp://docs.angularjs.org/api/ng。$ anchorScroll)服务。我不确定它是如何工作的,因为我从来不需要使用它,但我知道它解决了你的问题。

答案 1 :(得分:0)

在您的网址(http://my-site.uk/user/dashboard.html#my-work1)中尝试将'my-work1'传递给routeProvider中的参数,例如http://my-site.uk/user/dashboard.html/my-work1

示例:

when('/my/route/:param', {
    templateUrl: '/mywork/partials/param.html',
    controller: WorkCtrl
})
在控制器中

,使用$ routeParams获取此参数。

var myParam = $routeParams.param
$location.hash(myParam)//set anchor
$anchorScroll()//do scroll

我希望这能解决你的问题