我有一个包含我的API调用的服务的应用程序:
var ConcernService = { ... get: function (items_url,objId) { var defer = $q.defer(); $http({method: 'GET',url: api_url + items_url + objId}). success(function (data,status,headers,config) { defer.resolve(data); }).error(function (data,config) { console.log('ConcernService.get status',status); defer.reject(status); }); return defer.promise; },
我正在使用UI-Router在状态之间切换:
concernsApp .config( function ($stateProvider,$urlRouterProvider) { $urlRouterProvider.otherwise("/404/"); $stateProvider.state('project',{ url: '/project/:projectId/',resolve: { project: function ($stateParams,ConcernService) { return ConcernService.get('projects/',$stateParams.projectId); },},views: { ... } });
我正在使用正常的Angualr路由器,我很难理解如何实现404s.我可以看到ConcernService抛出的console.log状态被拒绝了,但是如何在状态路由器上抓到这个?
任何帮助非常感谢.
否则()规则仅在没有其他路由匹配时被调用.你真正想要的是拦截$stateChangeError事件,这是在状态转换中出现问题(例如,@R_404_323@失败)时被触发的.您可以在
state change event docs中阅读更多内容.
你最想做的最简单的实现就是这样:
$rootScope.$on('$stateChangeError',function(event) { $state.go('404'); });
另外,由于$http本身是建立在承诺(解决方案)的基础上的,您的ConcernService方法可以简化为单线程(我意识到您将其扩展为调试目的,但您可以轻松链接它,只是FYI ):
var ConcernService = { get: function (items_url,objId) { return $http.get(api_url + items_url + objId); } }