处理数据服务或控制器

Process data - in service or controller?

本文关键字:控制器 服务 数据 处理      更新时间:2023-09-26

这是一个关于代码组织和最佳实践的问题。

我从一个api与$资源检索数据,我需要处理它发送到视图之前。

我的问题是在哪一步处理实际数据。我的理解是,它应该在服务中完成,但我也想在控制器中进行实际的ajax调用。

就像现在一样,我注入服务并使用CdnService.sumOfVolumeRequest(response)等函数来处理数据。

我做的对吗?还是有更好的方法?

:

function updateVolumeRequest() {
    var params = {
      metric: "size",
      tStart: convertUtcToEpoch(SearchCriteria.criteria.dateFrom),
      tEnd: convertUtcToEpoch(SearchCriteria.criteria.dateTo)
    };
    return params;
  }
  function volumeRequest() {
    return CdnAnalyticsFactory.statsByDimension({
          accountId: Token.UserInfo().Id
        },
        updateVolumeRequest())
      .$promise;
  }

控制器:

  function getData() {
    var data;
    CdnService.sizeRequest(SearchCriteria.criteria.dateFrom, SearchCriteria.criteria.dateTo)
      .then(function onSucess(response) {
        data = CdnService.sumOfVolumeRequest(response)
      });

}

请参考John Papa的Angular Style Guide

重构进行数据操作和与工厂数据交互的逻辑。让数据服务负责XHR调用、本地存储、内存存储或任何其他数据操作。

问题是:服务应该是模块化的吗?你是否能够在另一个控制器中注入相同的服务,并保留相同的功能,使其即插即用?

如果您希望服务是自给自足的,那么最好在服务本身中进行数据争用。其思想是让服务在每次调用时都以所需的格式提供数据。如果将某些功能移出,则需要重复该代码。这是违反DRY原则的。

当然,有多少数据操作需要在服务内部进行,有多少需要在服务外部进行,这取决于您。

如果你在控制器中编写的代码是特定于你的控制器的逻辑,那么在控制器中编写它是可以的。但是,建议不要包含每次调用服务时都需要重复的代码。

这取决于上下文。

如果逻辑与视图无关,你可以将代码移动到服务中,以便你可以在其他控制器中重用它但是如果有特定于视图的逻辑,你可以在控制器

中编写