繁体   English   中英

控制器或服务中的角度过滤器$ http呼叫信息

[英]angular filter $http call information in controller or service

我认为最好的做法是使用返回http调用信息作为承诺的服务,并将这些信息添加到控制器的作用域中。 喜欢:

awesomeService.getAllInformation().then(data){
  $scope.data = data;
}

问题:如果我想过滤http调用返回的信息,是否要在控制器中执行此操作? 或在服务中使用其他方法? 控制器中的示例:

awesomeSvc.getAllInformation().then(data){
  angular.forEach(data,function(dataItem, dataIndex){
    if(dataItem === 'foo'){
       $data = dataItem
    }
  }
}

还是我创建第二个服务,负责处理或过滤http调用接收的信息。 像这样的文件结构:

File1:所有HTTP调用的服务File2:所有调用的操作File3:控制器

这样awesomeService调用将在第二个服务中进行:

function dataManipulationInSecondService(){
  var data = "";
  awesomeService.getAllInformation().then(data){
    angular.forEach(data,function(dataItem, dataIndex){
      if(dataItem === 'foo'){
         data = dataItem
      }
    }
  }
  return data;
}

然后在控制器中:

secondService.dataManipulationInSecondService().then(data){
    $scope.data = data;
}

我希望我的问题不会太混乱,并且有人可以告诉我最佳实践;)

谢谢你的帮助

在AngularJS中,过滤器是框架中的一等公民。 您需要做的就是创建一个带有可选参数的命名过滤器:

app.filter('AwesomeFilter', function(){

    return function(data, name) {
       var filteredItems = [];
       angular.forEach(data,function(dataItem, dataIndex){
          if(dataItem === name){
              filteredItems.push(dataItem);
       }
       return filteredItems;
    }

}

然后您可以在服务,控制器,视图等中使用它

在控制器中使用AwesomeFilter

注入$ filter服务,并使用它来过滤来自AwesomeDataService的数据:

app.controller('ctrl', function ($scope, $filter, AwesomeDataService) {
    $scope.data = [];
    AwesomeDataService.getAllInformation().then(function(data){
         $scope.data = $filter('AwesomeFilter')(data, 'foo');
    });
}); 

在服务中使用AwesomeFilter

app.factory('AwesomeDataService', function ($filter, $http) {
    return {
        getFooInformation: function() {
            return $http({...}).then(function(data) {
                return $filter('AwesomeFilter')(data.data,'foo');
            });
        }
    }
}); 

在视图中使用AwesomeFilter

<div ng-controller="awesomeCtrl">
     <ul>
         <li ng-repeat="dataItem in data | AwesomeFilter:'foo'"> 
             {{ dataItem }}
         </li>
     </ul>
</div>

不要在同一服务中过滤数据,因此您可以针对不同的控制器重复使用该服务,如果有一些不同的控制器(例如),则将过滤移至控制器或其他服务取决于您的需要。将需要过滤的数据,则需要将代码提取到共享服务,但是,如果过滤是针对每个控制器的,则将过滤器放入控制器

首先,正如您已经提到的,使用服务是从服务器检索数据的最佳实践。

如我所见,我将使用以下两个选项之一:

  1. 过滤器不可重用,只有一个控制器需要过滤:在这种情况下,我不会过滤服务上的数据,这是控制器的特定需求,过滤器逻辑将在控制器中执行。

  2. 更多的控制器可能需要对该服务\\资源使用数据过滤:在这种情况下,我会将过滤逻辑移至服务,您可以使用过滤器参数公开服务的get方法,这样每个控制器都可以将过滤器参数传递给服务,并且服务将能够相应地过滤数据。

正如@pixelbits提到的,您可以使用可重复使用的过滤器(很好的答案),我能想到的主要区别是,通过使用过滤器,您将从服务器获取所有数据,然后再对其进行过滤。 如果您使用该服务,则可以将过滤器逻辑移至服务器,并且这样做可以减轻服务器-​​客户端之间的有效负载,如果您要处理大量数据,则可能很重要。

希望它回答了您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM