我在这里看到的问题是您正在尝试访问$stateParams
before国家已经准备好了。更改状态时会发生几个事件。
首先是$stateChangeStart
您将在其中收到要更改的状态和来自的状态以及这两个状态中的所有参数的通知。
此后,决心开始发生。您的情况的解决方案是调用一个使用的函数$stateParams
在一切都解决并且良好之后(没有拒绝或错误),并且就在之前$stateChangeSuccess
事件,状态参数在中更新$stateParams object.
基本上,您无法通过以下方式访问要更改的状态的参数$stateParams
反对直到after状态变更完成。这样做是为了防止状态更改被拒绝且无法更改。在这种情况下,先前的状态仍然存在,并且先前状态的参数将位于$stateParams
.
作为一种快速解决方法,您可以使用$stateChangeStart事件来访问toParams
(您要更改的状态的参数)并将它们放在某个地方($rootScope
或服务),以便您可以在需要时访问它们。
这是一个简单的例子$rootScope
.run(['$rootScope', function($rootScope){
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
$rootScope.toParams = toParams;
});
}]);
.factory('CategoryLoader',['$rootScope', 'Category', '$q',
function($rootScope, Category, $q){
return function(){
var delay = $q.defer();
Category.get({cat_id: $rootScope.toParams.id}, // <-- notice its using the object we put in $rootScope, not $state or $stateParams
function(category){
delay.resolve(category);
},
function(){
//delay.reject('Unable to fetch category ' + $state.params.cat_id)
});
return delay.promise;
}
}]);
另外,我相信您的资源未设置为正确使用您传递的 id。你正在使用cat_id
上面,为了将其链接到:id
URL 的,您必须将其映射为 `{id: '@cat_id'}
factory('Category', function($resource){
return $resource('/api/category/byId/:id/', {id: '@cat_id'});
});