我可以把哪些东西放在有角度的Js中

Which things i can put in service in angular Js

本文关键字:Js 我可以      更新时间:2024-01-23

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

目前这是我的服务

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()来将数据分配给Grid。

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

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

理想情况下,我想把所有像remove(object_id)这样的功能都投入服务

我可以在控制器中执行objectiveService.remove(id)吗。

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

使用服务的原因不是为了避免使用.then。在你的控制器中,你会像这样使用.then

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

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

约翰·帕帕的风格指南中的一些原因:

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

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

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

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

相关文章: