【问题标题】:UI router resolve do not workUI 路由器解析不起作用
【发布时间】:2016-01-01 23:26:45
【问题描述】:

现在我正在尝试制作一个 Angular JS 安装应用程序,以安装一个 CMS。所以我试图阻止对状态(ui路由器)的访问,我正在使用解析功能来做这件事。但问题是,我向 API 发出 get 请求,它返回 true 或 false,并且 resolve 函数不等待 get 请求完成,所以它只是加载状态。

这是我的代码:

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 返回的内容:

【问题讨论】:

    标签: javascript html angularjs


    【解决方案1】:

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

    $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 Service API Reference -- chaining promises

    【讨论】:

      【解决方案2】:

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

      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 参数返回一个回调,状态将在promise is resolved 之后加载。

      【讨论】:

      • 如果我在解析中有 $http 请求,那么为什么要有 rootscope?
      • 应该不会再凌晨3点回答问题了。该代码应该已被注释掉,无论如何解析都会起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 2016-06-10
      • 2017-06-25
      相关资源
      最近更新 更多