我可以在 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 等其他服务。将逻辑分离到数据服务中可将此逻辑封装在一个位置,从而对外部消费者(可能是控制器)隐藏实现,也使更改实现变得更容易。
如果您将代码放在控制器中,这也意味着它不可重用。您不能在多个控制器中使用它,也不能在其他服务中使用它。
我已经阅读了很多文章,但仍然找不到如何将东西放入服务中。
目前这是我的服务
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 等其他服务。将逻辑分离到数据服务中可将此逻辑封装在一个位置,从而对外部消费者(可能是控制器)隐藏实现,也使更改实现变得更容易。
如果您将代码放在控制器中,这也意味着它不可重用。您不能在多个控制器中使用它,也不能在其他服务中使用它。