2016-03-07 118 views
3

我得到了一个控制器CounterpartyCtrl这是由两个视图使用。如何防止请求重复?

第一个视图包含一个选择器,它需要集合中的所有记录。因此,我获取所有对象并将其放入$ scope.counterparties

 app.controller('CounterpartyCtrl', [ 
     '$scope', 'Counterparty', function($scope, Counterparty) {}, 
     $scope.counterparties = {}, 

     $scope.loadCounterparties = function() { 
      Counterparty.query(function(response) {}); 
      $scope.counterparties = response; 
     }, 

     $scope.loadCounterparties(); 

    ]); 

第二个视图必须仅包含按组划分的交易对手。

$scope.customers 
    $scope.vendors 
    $scope.others 
    $scope.HRs 

因此,使用相同的控制器我取他们像下面

app.controller('CounterpartyCtrl', [ 
    '$scope', 'Counterparty', function($scope, Counterparty) {}, 
    $scope.counterparties = {}, 

    $scope.loadCounterparties = function() { 
     Counterparty.query(function(response) {}); 
     $scope.counterparties = response; 

     $scope.customers = Counterparty.query({ 
     group: 'Customer' 
     }); 

     $scope.vendors = Counterparty.query({ 
     group: 'Vendor' 
     }); 

     $scope.others = Counterparty.query({ 
     group: 'Other' 
     }); 

     $scope.HRs = Counterparty.query({ 
     group: 'HR' 
     }); 
    }, 

    $scope.loadCounterparties(); 

]); 

正如你可以看到这里是请求的明显重复。在每一个观点上,我提出了同样的要求,因此这不是生产性的。我如何重构代码?

+1

使用$ Q,并返回一个承诺。然后对对方ies.query的后续调用不会执行HTTP请求,而是返回最初获取的值。 – Jupo

+0

@Jupo你能在答案中提供一个例子吗? –

回答

1

这里就是我的意思有关使用$ q和缓存结果的服务,以避免多个请求:为counterparties.query http://plnkr.co/edit/3AeOjHaVo8MrY18tStEs

app.factory("dataService", ["$http","$q", function($http, $q){ 
    var counterParties; 
    return { 
     query: function(param){ 
      if(!counterParties){ 
       counterParties = $q.defer(); 
       $http.get("requestURL").then(function(response){ 
        counterParties.resolve(response.data); 
       }); 
      } 
      return counterParties.promise; 
     } 
    }; 
}]); 
1

你可以改变你的后端返回这样的事情

{ 
    'Customers': customers, 
    'Vendors': vendors, 
    'Other': others, 
    'HR': hrs 
} 

,然后用它来制作一个完整的阵列,或者只是抓住你根据当你调用它需要的部分。只有在所有用户都可以访问所有数据的情况下才能做到这一点,如果他们查看网络选项卡中的响应数据,则可以。它还会在您的前端为客户处理更多的工作。

希望这可以帮助您寻找。