【问题标题】:$location.path doesn't change in a factory with AngularJS$location.path 在使用 AngularJS 的工厂中不会改变
【发布时间】:2013-10-30 05:29:15
【问题描述】:

我的工厂是这样的:

'use strict';

angular.module('myApp')
  .factory('httpInterceptor',['$q','$location', '$rootScope', function($q, $location, $rootScope){
    return {
      response: function(response) {

        if(response.success === false) {
console.log("Redirecting");
            $location.path('/login');
            return $q.reject(response);
        }

        return response || $q.when(response);
      }
    }
}]);

它会吐出日志,但不会更改路径。我该怎么做才能做到这一点?

【问题讨论】:

标签: angularjs angularjs-routing angularjs-factory


【解决方案1】:

documentation for $location 说:

请注意,setter 不会立即更新 window.location。相反,$location 服务知道范围生命周期,并在范围 $digest 阶段将多个 $location 突变合并为一个对 window.location 对象的“提交”。

因此,如果拒绝承诺对$location 产生影响,那么您可能看不到预期的更改。

要强制在角度生命周期之外进行更改,您可以使用window.location 设置hash,然后强制重新加载页面。当然,这将停止执行后面的任何代码并删除会话,但如果用户未登录,这可能是您想要的。

【讨论】:

  • 我发现无法获得各种角度解决方案来重定向工作,并且不得不求助于 window.location 进行重定向,这非常令人沮丧。
【解决方案2】:

在某些情况下,如果 $location 在 Angular 的应用周期之外,它不会重定向。尝试将 $location 包裹在 $apply 中。

$rootScope.$apply( function(){$location.path('/somelocatin'); } );

【讨论】:

  • 你在欺骗 Angular 吗?
  • 使用这种方法有风险吗?我用过它——它奏效了。这会影响应用程序状态吗?
【解决方案3】:

这个在 Angular 1.3.14 上为我工作

myServices.factory('Factory', ['$rootScope', '$location', function ($rootScope, $location) {
  // do something and redirect
  $location.path('path')
  $rootScope.$apply()
}])

请注意,$rootScope.$apply()$location.path('path') 调用之后,出于某种原因,如上所述将其包装在 $apply 调用回调中不起作用。

【讨论】:

    【解决方案4】:

    试试

    $location.path('#/login');
    

    而不是

    $location.path('/login');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 2016-05-01
      • 1970-01-01
      • 2014-07-14
      • 2012-12-23
      • 1970-01-01
      相关资源
      最近更新 更多