0

Web サイトで何かを行う前にアクセスする必要があるデータベースにテーブルがあります。取得した値は、さまざまなコントローラー、ディレクティブ、サービスなど全体で使用します。これらの値を保存するのに最適な場所は、$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 を使用する代わりに、スコープにアタッチできる promise を返す angular $http を使用する必要があります。定義によるプロミスはすぐに定義され、プロミスが解決されるとスコープが設定されます。そのAngularテンプレートに加えて、プロミスを完全に理解し、準備が整うとすぐにモデルをビューに表示します.

于 2015-08-02T17:47:14.467 に答える