2014-12-18 3 views
0

В настоящее время я играю с угловым, и мне сложно найти способ выяснить это. Проблема в том, что я запускаю $ http-метод на app.run(). $ http метод получить комнаты от сервера и инициализировать его в $ rootScope.rooms var. В контроллере я использовал эту переменную комнат. Поскольку метод $ http является асинхронным, и иногда он получает значение null, потому что контроллер загружен до завершения метода. Я пытаюсь справиться с этим по-другому.Функция Async в методе angular.run() не была выполнена до контроллера

game.js
angular.module('GameModule', []) 
.run([function ("injectors...") { 
    $http.get("/rooms").success(function(result){ 
     $rootScope.rooms = result; 

    }).error(function(error){ 
     console.log('Error fetching rooms'); 
    }); 
}]) 
.controller('GameCtrl', ['$scope', function ($scope) { 
    console.log($rootScope.rooms); 
}]); 

Поскольку номер переменный будет использоваться в других файлы тоже я не вероятно, хочу поставить $ HTTP метода внутри каждый контроллер, если нет других способов. Если было бы неплохо, если бы я мог использовать некоторую услугу углов

+0

Это характер асинхронных событий. У вас ограниченный контроль после завершения HTTP-запросов и, следовательно, когда эти данные будут доступны. См. [Инициализация службы AngularJS с асинхронными данными] (http://stackoverflow.com/questions/16286605/initialize-angularjs-service-with-asynchronous-data) для решений. – user2943490

+0

Вы пробовали $ rootScope. $ Watch – byrdr

+0

Если вы используете угловой маршрутизатор, вы можете определить блок разрешения, чтобы страница не переместилась в GameCtrl до тех пор, пока не будет загружен вызов 'room'. Это обычный способ обеспечить загрузку службы перед тем, как перейти на страницу, которая ее использует. – Benmj

ответ

2

Это обычное поведение angularJs, потому что каждый вызов REST является асинхронным. Если вы хотите, чтобы он был более управляемым или вел себя синхронно, вам придется использовать «обещание» (услуга $ q в angularJs). Пожалуйста, найдите фрагмент кода

сервисный код: (который вы хотите использовать)

app.lazyload.factory('myService',['$http','$q', function($http,$q) { 

     return{ 
      showAll :function() 
      { 
       var deferred = $q.defer(); 
       $http.post('rest/getAll?cd='+ (new Date()).getTime()) 
       .success(function(data) 
       { 
        deferred.resolve(data); 
       }) 
       .error(function(data) 
       { 
        deferred.reject(null); 
        console.log("in error block"); 
       }); 

       return deferred.promise; 
      } 
     }; 

    }]); 

код контроллера: (Для вызова службы)

function showAll() 
       { 
        var promise = myService.showAll(); 

        promise.then(function success(data) { 
         $scope.allitems = data; 
         console.log(data); 
         console.log('$scope.allitems'+$scope.allitems[0].name); 

        }, function error(msg) { 
         console.error(msg); 
        }); 

       }; 

Я обновил свой ответ. поместите вызов showAll() в начало тела контроллера. Из вашего вопроса я предполагаю, что вы хотите загрузить некоторые данные во время инициализации. Такой подход даст вам тот же результат.

+0

означает ли это, что он ждет завершения процесса в app.run(), а затем он запустит app.controller? – Sanny

+0

не работает и все тот же результат – Sanny

+0

Я обновил свой ответ. попробуй это сейчас. – rishi