4

这应该是一个相当直接的问题,但我很难过。

我有一项服务可以进行 http 调用,然后对结果进行广泛的后处理。我希望将处理后的结果分配给 $scope.variable 并在几个不同的视图中使用。问题是每个视图都有单独的控制器,但我不希望每个控制器调用服务以从资源中获取相同的数据并为每个控制器进行一次后处理。

超级简化我有这个:

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 服务。你为什么不在你的数据服务中返回一个承诺(就像$http.get...),当 CPU 密集处理完成时解决?你也可以像angular $resource 服务一样返回一个空对象,一旦处理完成就会被填充(在下面的例子中,我假设 processes_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 示例

于 2013-04-17T06:55:37.117 回答