2014-09-19 48 views
0

我使用这个捕获错误并重定向到一个错误页面转到错误状态和URL保持的状态产生

module.run(function ($state, $rootScope, translateService) { 
    $rootScope.$on("$stateChangeError", function (event, toState, toParams, fromState, fromParams, error) { 
     $state.go("app.error"); 
    }); 
}); 

错误,但这个移动到错误状态,并改变URL 。我想转到错误页面并将URL保存到出错页面。

我试过使用位置选项$state.go("app.error", null, { location: false }),但它保持我来自的状态的URL而不是错误的URL。

我可以以某种方式进入错误状态并保留URL或进入错误状态,然后将URL更改回toState的URL?

回答

3

我通过将错误信息发送到错误状态来解决它,然后在那里设置带有$ location.path的url。

module.run(function ($state, $rootScope) { 
    $rootScope.$on("$stateChangeError", function (event, toState, toParams, fromState, fromParams, error) { 
     $state.get("app.error").$error = { 
      toState: toState, 
      toParams: toParams, 
      fromState: fromState, 
      fromParams: fromParams, 
      message: error.message, 
      stack: error.stack 
     }; 

     $state.go("app.error"); 
    }); 
}); 

module.config(function ($stateProvider, $urlRouterProvider) { 
    $stateProvider.state("app.error", { 
     url: "/error", 
     resolve: { 
      error: function() { 
       return this.self.$error; 
      } 
     }, 
     templateUrl: "app/error.tpl.html", 
     controller: function ($state, $scope, $log, $location, error) { 
      if (error) { 
       $location.path($state.href(error.toState, error.toParams).replace(/^#/, "")); 
       $log.error(error.message, error.stack); 
      } 

      $scope.error = error; 
     } 
    }); 
}); 
0

我觉得这个做的伎俩(我发现这招前一段时间,它不记录):

$rootScope.$on("$stateChangeError", function (event, toState, toParams, fromState, fromParams, error) { 
    event.preventDefault(); 

    $state.go("app.error", {}, { location: false }); 
}); 

https://github.com/angular-ui/ui-router/wiki 看看约$ stateChangeError

+0

等一下对不起。这只适用于像href或直接浏览器地址栏更新那样的直接url导航。 不带$ state.go。 – FloG 2015-06-12 12:54:25

0

到零件添加到接受的答案,我做了一个小的更改,让我保留错误的url,但尝试去用户试图刷新时的主页(或任何你想要的状态):

controller: function ($state, $scope, $log, $location, error) { 
     if (error) { 
      $log.error(error.message, error.stack); 
     }else{ 
      $state.go('app'); // or app.home or whatever 
     } 

     $scope.error = error; 
    }