![](/img/trans.png)
[英]Unit Test in angular js controller that call service with http request
[英]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>
不要在同一服务中过滤数据,因此您可以针对不同的控制器重复使用该服务,如果有一些不同的控制器(例如),则将过滤移至控制器或其他服务取决于您的需要。将需要过滤的数据,则需要将代码提取到共享服务,但是,如果过滤是针对每个控制器的,则将过滤器放入控制器
首先,正如您已经提到的,使用服务是从服务器检索数据的最佳实践。
如我所见,我将使用以下两个选项之一:
过滤器不可重用,只有一个控制器需要过滤:在这种情况下,我不会过滤服务上的数据,这是控制器的特定需求,过滤器逻辑将在控制器中执行。
更多的控制器可能需要对该服务\\资源使用数据过滤:在这种情况下,我会将过滤逻辑移至服务,您可以使用过滤器参数公开服务的get方法,这样每个控制器都可以将过滤器参数传递给服务,并且服务将能够相应地过滤数据。
正如@pixelbits提到的,您可以使用可重复使用的过滤器(很好的答案),我能想到的主要区别是,通过使用过滤器,您将从服务器获取所有数据,然后再对其进行过滤。 如果您使用该服务,则可以将过滤器逻辑移至服务器,并且这样做可以减轻服务器-客户端之间的有效负载,如果您要处理大量数据,则可能很重要。
希望它回答了您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.