После публикации некоторых данных с помощью Restangular я хочу перейти в другое состояние $ и перезагрузить данные с сервера с помощью этого кода:
.directive('ngShowBook', [function(){
return {
restrict : 'E',
controller :
$scope.myFunc = function(){
var bookRelated={ ...};
Restangular.service('books').post(bookRelated).then(function(){
$state.go('parent.main', null, {reload: true}).then(function(){
console.log('ok');
}, function(err) {
console.log(err);// <-this shows error message
});
});
}
.
.
.
и это мой маршрутизатор:
.state('parent', {
abstract: true,
url: '/parent',
templateUrl: 'app/parent/templates/home.html',
resolve: {
books:function(Restangular) {
return Restangular.one('books',10).get();
},
},
}).state('parent.main',{
url: '/main',
templateUrl: 'app/parent/templates/main.html',
})
Когда я отправляю данные, он переходит в новое состояние $, но без перезагрузки функции разрешения. Его сообщение об ошибке:
Error: transition prevented
at $StateProvider.$get (http://localhost:3000/bower_components/angular-ui-router/release/angular-ui-router.js:2867:41)
at Object.invoke (http://localhost:3000/bower_components/angular/angular.js:4473:17)
at http://localhost:3000/bower_components/angular/angular.js:4290:37
at getService (http://localhost:3000/bower_components/angular/angular.js:4432:39)
at Object.invoke (http://localhost:3000/bower_components/angular/angular.js:4464:13)
at http://localhost:3000/bower_components/angular/angular.js:4294:79
at forEach (http://localhost:3000/bower_components/angular/angular.js:336:20)
at createInjector (http://localhost:3000/bower_components/angular/angular.js:4294:3)
at doBootstrap (http://localhost:3000/bower_components/angular/angular.js:1655:20)
at bootstrap (http://localhost:3000/bower_components/angular/angular.js:1676:12)
В соответствии с этим я должен добавить event.preventDefault(); , но теперь я не могу добавить его в этом случае. И это решение проблемы?
Рассматривая исходный код, который генерирует ошибку, я справился с этой проблемой с помощью такого кода:
if ($state.current.name == 'parent.main')
$state.transitionTo($state.current, $stateParams, {reload: true, inherit: true, notify: false})
else
$state.go('parent.main', null, {reload: true});
ключевым моментом является параметр notify:false
, поэтому вы должны хорошо понимать смысл его поведения (он не будет запускать события $ state с некоторыми последствиями), но если он подходит для вашего сценария, с этим кодом, ваше состояние вызывается функция разрешения.
У меня была аналогичная проблема, и мне удалось ее решить, сделав что-то похожее на рекомендации, приведенные в комментариях, а именно перенаправить на фиктивный маршрут (в этом случае я использовал свой индексный маршрут, поскольку он фактически ничего не делает), а затем немедленно перенаправить обратно к намеченному маршруту. Это глупый обходной путь, и я все еще ищу что-то лучшее, но сейчас он работает;
$state.go('index').then(function(result) {
$state.go('intended.route', {
// params
}, {
// options
});
{reload: true}
не будет перезагружать родительское состояние, оно только заставит перезагрузить текущее состояние. Чтобы вызвать полную перезагрузку, вы можете определить другое состояние, назовем егоreloadState
и создадим переход кreloadState
а затем сразу кparent.main
.