首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UI路由器解析不起作用

UI路由器解析不起作用
EN

Stack Overflow用户
提问于 2016-01-01 23:26:45
回答 2查看 148关注 0票数 0

现在,我正在尝试做一个角度JS安装应用程序,以安装一个CMS。因此,我试图阻止对状态(ui路由器)的访问,我使用的是一个解析函数。但问题是,我向API发出get请求,该API返回true或false,解析函数不等待get请求完成,所以它只是加载状态。

这是我的代码:

代码语言:javascript
复制
app.run(['$rootScope', '$http', function($rootScope, $http) {
  $rootScope.$on('$stateChangeStart', function() {
    $http.get('/api/v1/getSetupStatus').success(function(res) {
      $rootScope.setupdb = res.db_setup;
      $rootScope.setupuser = res.user_setup;
    });
  });
}]);
app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
  $urlRouterProvider.otherwise("/404");

  $stateProvider.state('db-install', {
      url: "/install/db",
      templateUrl: 'admin/js/partials/db-install.html',
      controller: 'DBController',
      resolve: {
        data: function($q, $state, $timeout, $rootScope) {
          var setupStatus = $rootScope.setupdb;
          var deferred = $q.defer();

          $timeout(function() {
            if (setupStatus === true) {
              $state.go('setup-done');
              deferred.reject();
            } else {
              deferred.resolve();
            }
          });
          return deferred.promise;
        }
      }
    })
    .state('user-registration', {
      url: "/install/user-registration",
      templateUrl: "admin/js/partials/user-registration.html",
      controller: "RegisterController"
    })
    .state('setup-done', {
      url: "/install/setup-done",
      templateUrl: "admin/js/partials/setup-done.html"
    })
    .state('404', {
      url: "/404",
      templateUrl: "admin/js/partials/404.html"
    });
}]);

在这里您可以看到加载页面的时间线:

在这里您可以看到API返回的内容:

EN

回答 2

Stack Overflow用户

发布于 2016-01-03 06:03:29

您的db-install解析器函数需要从$http.get链接以获得安装状态。

代码语言:javascript
复制
$stateProvider.state('db-install', {
    url: "/install/db",
    templateUrl: 'admin/js/partials/db-install.html',
    controller: 'DBController',
    resolve: {
        data: function($state, $http) {
            return $http.get('/api/v1/getSetupStatus'
                       ).then (function(result) {
                           var setupdb = result.data.db_setup;
                           var user_setup = result.data.user_setup;
                           //return for chaining
                           return setupdb;
                       }).then (function (setupStatus) {
                           //use chained value
                           if (setupStatus === true {
                               //chain with $state.go promise
                               return $state.go('setup-done');
                           } else {
                               //resolve promise chain
                               return 'setup-not-done';
                           };
                       })
        }    
    }
})

通过从状态$http.get返回链接,解析器函数在执行(或不执行) $state.go之前等待。

有关链接承诺的更多信息,请参见AngularJS $q服务API引用-链接承诺

票数 0
EN

Stack Overflow用户

发布于 2016-01-02 03:21:28

getSetupStatus的调用在$stateChangeStart中执行,因此resolve不知道必须等待。您可以将$http调用放入解析函数中,如下所示:

代码语言:javascript
复制
function($q, $state, $timeout) {
return $http.get('/api/v1/getSetupStatus')
  .then(function(res) {
      if(res.db_setup) {
         $state.go('setup-done');
      }
      else {
         return true;
      }
  });
}

通过使resolve参数返回回调,状态将在承诺已成定局之后加载。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34561087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档