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工厂的时间,即使在某个时候我确实得到了结果。我将如何解决我遇到的这个问题?

回答:

为此废弃 $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});
}]);
4

2 回答 2

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;
}
于 2015-08-02T17:48:31.747 回答
0

而不是使用 jquery $ service 你应该使用 angular $http 它返回一个你可以附加到你的范围的承诺。根据定义,promise 会立即定义,并且当 promise 解决时,您的范围将被填充。在该角度模板之上,您可以完全理解 Promise,并在准备好后立即在视图中显示您的模型。

于 2015-08-02T17:47:14.467 回答