Ui-Router $ state.go()不重新加载数据

时间:2015-09-19 08:54:57

标签: angularjs angular-ui-router

使用Restangular发布一些数据后,我想转到另一个$ state并使用以下代码从服务器重新加载数据:

.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',
})

当我发布数据时,它会转到新的$ state但不重新加载resolve函数。它的错误信息是:

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)

根据this我必须添加event.preventDefault(); ,但我现在不能在这种情况下添加它。这是解决问题吗?

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题并设法通过做类似于评论中给出的建议来解决它,即重定向到虚拟路线(在这种情况下,我使用了我的索引路线,因为它实际上并没有做任何事情)然后立即重定向回到预定的路线。这是一个愚蠢的解决方法,我仍在寻找更好的东西,但它现在有效;

$state.go('index').then(function(result) {
 $state.go('intended.route', {
  // params
 }, {
  // options
});

答案 1 :(得分:1)

查看产生错误的source code,我用这种代码解决了这个问题:

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参数,所以你必须很好地理解它的行为的意义(它不会用some consequences来触发$ state的事件),但是如果它对你的使用此代码,将调用您的状态的解析函数。