Javascript 使用angular ui路由器解决404问题

Javascript 使用angular ui路由器解决404问题,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我有一个方法服务: service.getVenueBySlug = function(slug) { return $http.get(API + '/venue/' + slug); }; 在我的app.routes.js`: .state('app.venue', { url: '/venues/:venueSlug', templateUrl: '/app/views/venue.html', controller: 'VenueController', res

我有一个方法服务:

service.getVenueBySlug = function(slug) {
    return $http.get(API + '/venue/' + slug);
};
在我的app.routes.js`:

.state('app.venue', {
  url: '/venues/:venueSlug',
  templateUrl: '/app/views/venue.html',
  controller: 'VenueController',
  resolve: {
    venue: ['VenueService', '$stateParams', '$state', function (VenueService, $stateParams, $state) {
      return VenueService.getVenueBySlug($stateParams.venueSlug).then(function(res) {
        return res.data;
      }).catch(function(err) {
        $state.go('app.404');
      });
    }]
  }
})
控制器
VenueController
仅具有:

$scope.vention=场馆

一切正常,如果我用错误的地址段塞手动转到URL,它会正确地重定向到404

问题是,我在控制台中收到一个错误,它困扰着我:


有人知道怎么修理吗?我使用的是angular 1.6.4和angular ui router 1.0.6。

正如在你的帖子评论中提到的,在你的resolve's catch中,你可能应该做以下几行:return$q.reject({redirectTo:app.404})

然后在路由器配置中侦听stateChangeErrors:

$rootScope.$on('$stateChangeError',
   function(event, toState, toParams, fromState, fromParams, error) {
      if(error.redirectTo) {
         $state.go(error.redirectTo);
      }
   } 
})
$q.reject是处理(中断)当前状态更改所必需的,stateChangeError用于处理该拒绝


(还没有测试代码,但我记得在我的一个项目中有一个类似的解决方案)

正如在你的帖子的评论中提到的,在你的resolve's catch中,你可能应该做一些事情:return$q.reject({redirectTo:app.404})

然后在路由器配置中侦听stateChangeErrors:

$rootScope.$on('$stateChangeError',
   function(event, toState, toParams, fromState, fromParams, error) {
      if(error.redirectTo) {
         $state.go(error.redirectTo);
      }
   } 
})
$q.reject是处理(中断)当前状态更改所必需的,stateChangeError用于处理该拒绝


(尚未测试代码,但我记得在我的一个项目中有类似的解决方案)

使用npm update angular ui router来更新ui router,可能会解决您的问题您可能应该拒绝承诺。(return$q.reject())@PetrAveryanov reject where?使用npm update angular ui router来更新ui router,可能会解决您的问题您可能应该拒绝承诺。(return$q.reject())@PetrAveryanov拒绝哪里?谢谢。使用
$stateChangeError
$state.defaultErrorHandler
有什么不同?defaultErrorHandler是1.0中的一个新增项。它们的作用是相同的。您可以在app.run中注册路由错误将传递给的函数。阅读文档迁移指南中的突破性更改:“所有状态事件(即$stateChange*和好友)现在都已被弃用并默认禁用”。因此,如果您使用的是1.0,请使用DefaultErrorHandler谢谢。使用
$stateChangeError
$state.defaultErrorHandler
有什么不同?defaultErrorHandler是1.0中的一个新增项。它们的作用是相同的。您可以在app.run中注册路由错误将传递给的函数。阅读文档迁移指南中的突破性更改:“所有状态事件(即$stateChange*和好友)现在都已被弃用并默认禁用”。因此,如果您使用的是1.0,请使用defaultErrorHandler