Javascript 如何在我的angular应用程序中可靠地重定向用户,而无需任何黑客攻击?

Javascript 如何在我的angular应用程序中可靠地重定向用户,而无需任何黑客攻击?,javascript,angularjs,redirect,angular-ui-router,Javascript,Angularjs,Redirect,Angular Ui Router,有时,在我处理angular项目的整个过程中,在ui路由器项目的情况下,重定向到不同的路由/状态根本不起作用。控制台中没有错误,执行重定向的代码行确实在我的浏览器中通过单步验证,但有时重定向就是不起作用 我试过以下方法 1$state.go'stateName';使用ui路由器 2$location.path'/url';使用内置角度布线 3 window.location.href='//url'简单的javascript方法,该方法重新加载页面,并且不利用DI或任何其他角度细节 我通过另一个

有时,在我处理angular项目的整个过程中,在ui路由器项目的情况下,重定向到不同的路由/状态根本不起作用。控制台中没有错误,执行重定向的代码行确实在我的浏览器中通过单步验证,但有时重定向就是不起作用

我试过以下方法

1$state.go'stateName';使用ui路由器

2$location.path'/url';使用内置角度布线

3 window.location.href='//url'简单的javascript方法,该方法重新加载页面,并且不利用DI或任何其他角度细节

我通过另一个SO问题得知,它与angular$digest循环有关,并且我必须在循环结束时执行位置重定向

人们建议采取以下变通办法:

将重定向包装为任意的setTimeout或$timeout,以强制它在当前$digest周期结束时发生。这是很糟糕的,不干燥,是一个令人讨厌的黑客,但它确实有效

调用$scope.apply;紧接着重定向代码,这也是不好的,因为你经常会得到已经在进行中的摘要,等等,并且,与上面的黑客一样,它不是干巴巴的,是一个恼人的黑客


因此,我的问题是:我如何保证重定向会发生,无论是通过普通javascript、$location、$state.go还是其他我可能不知道的代码行?

使用服务包装导航调用:

angular.module('app').service('navigation', ['$rootScope', function ($rootScope) {
  return { 
    navigate: function (url) {
      $location.path(url);
      $rootScope.apply();
    }
  }
}])
如果您愿意,也可以使用$timeout:

angular.module('app').service('navigation', ['$timeout', function ($timeout) {
  function go(){
    $location.path(this.url);
  }

  return { 
    navigate: function (url) {
      this.url = url;
      $timeout(go.bind(this));
    }
  }
}])
然后注入您的服务并呼叫:

navigation.navigate(url);

问题是,您无法使用$timeout或$scope。如果您希望angular确认源自angular摘要周期之外的调用(如DOM事件),则应用,因此您提出的任何解决方案都必须结合这两种调用之一。

为了保证重定向,而不是对抗angular的$digest周期,我会找到一种方法来处理它。任何你试图在不理解的情况下保证重定向的行为都将是一次黑客攻击。你能举一些不起作用的例子吗?