UI роутер не работает

0

Прямо сейчас я пытаюсь сделать приложение Angular JS для установки CMS. Поэтому я пытаюсь заблокировать доступ к состоянию (ui router), я делаю это с помощью функции разрешения. Но проблема в том, что я делаю запрос на получение API, который возвращает true или false, а функция разрешения не дожидается завершения запроса 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"
    });
}]);

Здесь вы можете увидеть график загрузки страницы: Изображение 174551

Здесь вы можете увидеть, что возвращает API: Изображение 174551

2 ответа

0

Ваш 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, функция resolver ждет перед выполнением (или не выполнением) $state.go.

Для получения дополнительной информации о обещаниях по цепочке см. Ссылку на API-интерфейс AngularJS $ q Service API.

-1

Вызов getSetupStatus выполняется в $stateChangeStart поэтому resolve не знает, что оно должно ждать. Вы можете поместить вызов $http внутри функции разрешения, например:

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 возвращает обратный вызов, состояние будет загружаться после того, как обещание будет разрешено.

  • 0
    Если у меня есть запрос $ http внутри разрешения, то зачем мне нужен rootоскоп?
  • 0
    Вероятно, не следует отвечать на вопросы в 3 часа утра снова. Этот код должен быть закомментирован, в любом случае решение будет работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню