4

これはかなり単純な質問ですが、私は困惑しています。

私は、http 呼び出しを行い、結果の広範な後処理を行うサービスを持っています。処理された結果を $scope.variable に割り当てて、いくつかの異なるビューで使用したいと考えています。ビューごとに個別のコントローラーがありますが、各コントローラーがサービスを呼び出して、リソースから同じデータを取得し、コントローラーごとに 1 回後処理する必要はありません。

非常に単純化された私はこれを持っています:

myModule.factory ('Data', function ($http, $q) {
  getData: $http.get...
  processData: this.getData().success(function(data){
    ... do a ton of cpu intensive processing ... 
    return processed_data
ctrl1 = function(Data,$scope) {
  $scope.data = Data.processData()
  }
ctrl2 = function(Data,$scope) {
  $scope.data = Data.processData()
etc...
}

明らかに、 $scope.data = Data.processData() を一度だけ設定して、すべてのコントローラーに入力したいと思います。現状では、各コントローラーが個別にサービスを呼び出すため、不要なトラフィックと CPU が作成されます。

単純なものがあると確信していますが、わかりません。すべてのコントローラースコープに共通の変数を定義できる「スーパー」スコープを作成する方法はありますか?

ありがとう、

4

1 に答える 1

6

$q serviceを挿入したようです。$http.get...CPU を集中的に使用する処理が完了したときに解決するデータ サービスで(のように) promise を返さないのはなぜですか? angular $resource サービスのようにして、処理が完了するとデータが入力される空のオブジェクトを返すこともできます(次の例では、processed_data が配列であると想定していますが、オブジェクトに対しても機能します)。

myModule.factory ('Data', function ($http, $q) {
  var deferred = $q.defer();
  var futureResult = [];
  //will get populated once processing is done, and is basically a cache

  $http.get('url').success(function(data){
    //... do a ton of cpu intensive processing ...
    for(var i=0; i<processed_data.length; i++){
      futureResult[i] = processed_data[i];
    }
    deferred.resolve(futureResult);
  });

  return {
    getProcessedDataPromise:function(){
     return deferred.promise;
    }
    ,getProcessedData:function(){
      return futureResult;
    }
  }
});

コントローラーで

ctrl1 = function(Data,$scope){
  Data.getProcessedDataPromise().then(function(data){
    $scope.data = data;
  });
}
ctrl2 = function(Data,$scope){
  $scope.data = Data.getProcessedData();
}

この plnkr exampleもご覧ください。

于 2013-04-17T06:55:37.117 に答える