2015-08-02 3 views
0

У меня есть таблица в базе данных, которую мне нужно получить, прежде чем что-нибудь еще будет на моем сайте. Значения, которые я получаю, я буду использовать все всюду разные контроллеры, директивы, услуги и т.д. Я думал, что лучшее место, чтобы хранить эти значения будут находиться в $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}); 
}]); 
+0

Нет ничего необычного в том, что контроллер получает данные через вызов ajax от службы. Почему ваш случай отличается? Он будет неопределенным на секунду, а затем будет заполнен значениями. –

+0

Потому что во время этой секунды появляются ошибки, потому что я пытаюсь получить доступ к свойствам чего-то неопределенного. Следовательно, мне нужно отложить выполнение до тех пор, пока я не уверен, что у меня есть объект, у которого есть свойства, к которым я могу получить доступ. –

+0

с использованием '$ rootScope' является анти-шаблоном, а создание службы, которая взаимодействует с' $ rootScope', является основным запахом кода. – Claies

ответ

2

Я бы сказал, что вам нужно переделать эту мелочь, используя promises.

Используйте сервис для хранения и возвращает эти данные, и с вашего контроллерами/директив/и т.д., вы можете сделать следующее:

DomainService.getDomains().then(function() { 
    // Do whatever you need, here you'll have the data 
}); 

Теперь служба должна возвращать данные, или взять его с сервера когда он не работает, когда приложение работает в первый раз:

// Domain service 
var domains; 

var getDomains = function() { 
    // using angular's $q service 
    var deferred = $q.defer(); 

    if (domains) { 
     // returns the data without going to the server 
     deferred.resolve(domains); 
    } 
    else { 
     // fetches the data the first time, also notice angular's $http service 
     $http.post('phpProcessingPage', data).then(function(response) 
      domains = response; 
      deferred.resolve(domains); 
     }); 
    } 

    return deferred.promise; 
} 
+0

Это мне совсем не помогает. Я ввожу эту услугу в контроллер. Если нет чего-то, что мне не хватает, служба выглядит так: service ('name', ['toInject', function (toInject) {/ * doStuffHere */return something;}]) 'Это означает, что независимо от того, как i откладывать и работать над вещами, я не могу избежать «возврата чего-то» от вызова. И когда он называется, он не определен - мой контроллер кричит на меня, «неопределенный». –

+0

Держите эту мысль. Я думаю, что все в порядке, однако у меня проблема с контроллером, кричащим на меня, что то, что я пытаюсь получить, не определено. –

0

Вместо того, чтобы использовать JQuery $ услуги вы должны использовать угловой $ HTTP, возвращающие обещание, которое вы можете приложить к своему охвату. Обещание по определению определяется сразу, и ваш объем будет заполнен, когда обещание будет разрешено. Вдобавок к этому угловому шаблону полностью понимают обещания и покажут вашу модель на виду, как только она будет готова.

+1

Нет, это не будет ... Вы получите обещание сразу, правильно, но если вы не назовете '. Then' на обещание, он не просто отобразит обещанное значение. –

+0

Просто попробовал в моем служении значения еще не определены. –

+0

@Newdev ok right Я думаю, что я слишком много в $ ресурсе в эти дни. – Franck

 Смежные вопросы

  • Нет связанных вопросов^_^