Angularjs ui-router, Как получить значение разрешения предзагрузки при срабатывании $stateChangeSuccess?
$stateProvider.state('home', {
url: '/',
resolve: {
person: function() {
return 'good'
}
}
как и выше, конфиг состояния, как я могу получить значение 'person' в функции обратного вызова $stateChangeSuccess?
$rootScope.$on('$stateChangeSuccess',
function(event, toState, toParams, fromState, fromParams) {
// I want get the 'person' value in this function, what should I do?
});
2 ответа
Решение
У нас была такая же проблема. Мы решили это, полагаясь на некоторые внутренние детали реализации ui-router; это означает, что он может сломаться в будущей версии angular, но вот функция, которую мы использовали:
function annotatedStateObject(state, $current) {
state = _.extend({}, state);
var resolveData = $current.locals.resolve.$$values;
state.params = resolveData.$stateParams;
state.resolve = _.omit(resolveData, '$stateParams');
state.includes = $current.includes;
return state;
}
Он получит параметры, включает в себя и все (разрешенные) объекты разрешения. Мы используем это в обратном вызове так:
$scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
toState = annotatedStateObject(toState, $state.$current);
var person = toState.resolve.person;
}
Надеюсь, это поможет!
Ответ Taxilian идеален, за исключением того, что я не использую Lodash, поэтому я внедрил _.omit. Вот мой результат.
function annotatedStateObject(state, $current) {
state = angular.extend({}, state);
var resolveData = $current.locals.resolve.$$values;
state.params = resolveData.$stateParams;
state.resolve = omit(resolveData, '$stateParams');
state.includes = $current.includes;
return state;
}
function omit(obj, arr) {
arr = Array.isArray(arr) ? arr : [arr];
arr.forEach(function(key){
delete(obj[key]);
});
return obj;
}