流程数据 - 在服务或控制器?

时间:2016-10-07 07:50:35

标签: javascript angularjs ajax

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

我使用$ resource从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)

      });

}

2 个答案:

答案 0 :(得分:2)

请参阅John Papa's Angular Style Guide

  

重构逻辑,用于进行数据操作并与数据交互到工厂。使数据服务负责XHR调用,本地存储,存储在内存或任何其他数据操作。

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

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

当然,您需要在服务中需要进行多少数据操作以及需要在外部发生的数量。

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

答案 1 :(得分:1)

这取决于具体情况。

如果逻辑是独立于视图的,您可以将代码移动到service,以便您可以在其他控制器中重复使用它,但是如果有一个特定于视图的逻辑,您可以在controller中编写