我可以在 angular Js 中投入使用哪些东西

Which things i can put in service in angular Js

我已经阅读了很多文章,但仍然找不到如何将东西放入服务中。

目前这是我的服务

angular
  .module('users')
  .factory('objectiveService', objectiveService);

objectiveService.$inject = ['$http', 'Restangular'];

function objectiveService($http, Restangular) {
  return {
    getObjectives: getObjectives,
    getSingleObjective: getSingleObjective
  };

  function getObjectives(pid) {
    var pr = Restangular
      .all('api')
      .all('users')
      .one('subjects', pid)
      .all('objectives');

    return pr;
  }

  function getSingleObjective(oid) {
    var pr = Restangular
      .all('api')
      .all('users')
      .one('objectives', oid);

    return pr

  }
}

这是控制器:

var _vm = this;
this.objPromise = objectiveService.getObjectives(44);

function getData() {
  var promise = _vm.objPromise;

  promise
    .getList(filters)
    .then(function(result) {
      $scope.gridData = result;
    });
}

function remove(id) {
  if (confirm('Are you sure you want to delete this!')) {
    objectiveService.getSingleObjective(id).remove().then(function() {
      $scope.getData();
    });

  }
}

// initial call   
$scope.getData();

在这段代码中,我基本上看不到定义服务的用处,因为我仍然必须在控制器中使用 then() 将数据分配给网格。

我也不能在服务中使用 then() 因为我没有 $scope 来更新数据。

人们说要在服务中做所有事情,但我不知道该怎么做。

理想情况下,我想将 remove(object_id) 等所有功能投入服务

我可以在控制器中做 objectiveService.remove(id) 吗?

但是我必须在删除后调用 $scope.getData(),这在服务中是做不到的

之所以使用服务,并不是为了避免使用.then。在您的控制器中,您可以像这样使用 .then

objectiveService.getObjectives(filters)
    .then(function(result) {
        $scope.gridData = result;
    });

.then 是必需的,因为获取数据的调用是异步发生的。

一些原因来自 John Papa's style guide

  • 控制器的职责是为视图呈现和收集信息。它不应该关心它如何获取数据,只关心它知道向谁索取数据。

  • 这使得在测试使用数据服务的控制器时更容易测试(模拟或真实)数据调用。

  • 数据服务实现可能有非常具体的代码来处理数据存储库。这可能包括 headers、如何与数据对话或 $http 等其他服务。将逻辑分离到数据服务中可将此逻辑封装在一个位置,从而对外部消费者(可能是控制器)隐藏实现,也使更改实现变得更容易。

如果您将代码放在控制器中,这也意味着它不可重用。您不能在多个控制器中使用它,也不能在其他服务中使用它。