AngularJS: внедрение сервиса в app.run

#javascript #angularjs #angularjs-directive #angularjs-scope

#javascript #angularjs #angularjs-директива #angularjs-область

Вопрос:

Я хочу инициализировать глобальную переменную «$ rootScope.SegmentSelectedGlobal» только при запуске приложения. Эта глобальная переменная получает данные из сервиса. Если я выполняю сервис через контроллер, он работает нормально. Но когда я выполняю его из App.run, значение не оценивается, и об ошибке не сообщается.

Вот код:

App.run :

  app.run(['$rootScope','DashboardService', function($rootScope,DashboardService) {
                    $rootScope.SegmentSelectedGlobal = DashboardService.getSegments();
                }]);
  

Обслуживание :

 app.service("DashboardService",function($q,$http,errorMessages){
       var allSegements = [];
        return {
                // For selected Only
                getSegments : getSegments
            }
         function getSegments(){
                var deferred = $q.defer();
                $http({
                    url: "/getAllSegments",
                    method: "GET"
                }).success(function (data, status, headers, config) {
                    deferred.resolve(data);
                    allSegements = data;
                }).error(function (data, status, headers, config) {
                    //logger.logError('Error while retrieving Versions details');
                     allSegements = null;
                });
                return allSegements;
            }
    });
  

Спасибо за вашу помощь.

Ответ №1:

Он возвращается undefined , потому что at return allSegements allSegements не определено.

Вы используете обещание, но забыли вернуть его правильно

 app.service("DashboardService",function($q,$http,errorMessages){
       var allSegements = [];
        return {
                // For selected Only
                getSegments : getSegments
            }
         function getSegments(){
                var deferred = $q.defer();
                $http({
                    url: "/getAllSegments",
                    method: "GET"
                }).success(function (data, status, headers, config) {
                    deferred.resolve(data);
                    allSegements = data;
                }).error(function (data, status, headers, config) {
                    //logger.logError('Error while retrieving Versions details');
                     deferred.reject();//--------- REJECT IF ERROR
                });
                return deferred.promise;//------- RETURN THE PROMISE
            }
    });

   app.run(['$rootScope','DashboardService',function($rootScope,DashboardService) {
    // use then to get the data from your promise ince it's ready
    DashboardService.getSegments().then(function(data){
            $rootScope.SegmentSelectedGlobal = data;       
    });
}]);
  

Примечание. если вы хотите дождаться разрешения обещанного перед загрузкой вашей страницы, используйте resolve атрибут (доступный как в ngRoute, так и в ui-router) :

  resolve:{
     segments:['DashboardService', function(DashboardService){
           return DashboardService.getSegments();//we return the promise, the resolve parameter will take the result, in case of error page won't be loaded.
     }];
 }