У меня есть таблица в базе данных, которую мне нужно получить, прежде чем что-нибудь еще будет на моем сайте. Значения, которые я получаю, я буду использовать все всюду разные контроллеры, директивы, услуги и т.д. Я думал, что лучшее место, чтобы хранить эти значения будут находиться в $rootScope
так с этой целью, я сделал следующее:
obApp.run(function($rootScope, ngProgress, $timeout) {
$.post('phpProcessingPage', function(data){
$rootScope.domains = JSON.parse(data); //this "domains" property is what i'm interested in
})
})
Я получаю домены обратно без заминки, поэтому все хорошо. Проблема заключается в том, когда я впрыснуть $rootScope
в сервис:
obApp.factory('requestOrigin', ['$rootScope', function($rootScope){
console.log($rootScope.domains); //this is undefined at this point
return $rootScope.domains; //returns undefined
}]);
Это следует ожидать, что не будет там ничего, как ответ придет после того, как сервис-кода выполняется.
Проблема в том, что я использую этот заводский код в нескольких контроллерах, и я не знаю, как отложить его выполнение, так что он ждет, пока я не получу данные из моего вызова ajax.
Я пробовал делать трансляцию, но нет способа (что я знаю), чтобы задержать фабрику retun
, даже если в какой-то момент я верну результаты. Как я могу решить эту проблему, которая у меня есть?
ОТВЕТ:
Scrap использование $ rootScope для этого. Контроллер, где я использовать возвращаемые результаты от службы выглядит следующим образом:
oApp.controller(['serviceName', function(serviceName){
serviceName.then(function(response){
//here i have the data from the ajax call, the service made
//other things to do
});
}]);
И обслуживание выглядит следующим образом:
obApp.factory(['serviceName','$http', function(serviceName, $http){
return $http.post('phpProcessingPage.php', {cache: true});
}]);
Нет ничего необычного в том, что контроллер получает данные через вызов ajax от службы. Почему ваш случай отличается? Он будет неопределенным на секунду, а затем будет заполнен значениями. –
Потому что во время этой секунды появляются ошибки, потому что я пытаюсь получить доступ к свойствам чего-то неопределенного. Следовательно, мне нужно отложить выполнение до тех пор, пока я не уверен, что у меня есть объект, у которого есть свойства, к которым я могу получить доступ. –
с использованием '$ rootScope' является анти-шаблоном, а создание службы, которая взаимодействует с' $ rootScope', является основным запахом кода. – Claies