为什么要使用 Angular 服务来收集信息,而不仅仅是 $http?
Why use Angular Service to gather information, instead of just $http?
两个选项,哪个更好,为什么:
示例 A。
- 应用模块
- 包含模型数据的服务
- 控制器从服务调用数据
文件 1:Users.js
:
angular.module('users', []);
文件 2:userService.js
:
angular.module('users').service('userService', ['$q', UserService]);
function UserService($q) {
var users = [
{
name: 'Bob Smith',
age: 26,
address: 'London',
},
{
name: 'John Simpson',
age: 41,
address: 'New York',
},
{
name: 'Maria West',
age: 36,
address: 'Chicago',
}
];
// Promise-based API
return {
loadAllUsers : function() {
// Simulate async nature of real remote calls
return $q.when(users);
}
};
}
})();
文件 3:UserController.js
:
angular.module('users').controller('UserController', ['$scope', function($scope) {
$scope.selected = null;
$scope.users = [];
$scope.selectUser = selectUser;
$scope.toggleList = toggleUsersList;
$scope.makeContact = makeContact;
userService
.loadAllUsers()
.then( function( users ) {
$scope.users = [].concat(users);
$scope.selected = users[0];
});
}]);
示例 B:
- 应用程序模块和控制器通过 $http 服务从 .json 文件绘制模型数据。
- json 保存模型数据的文件。
文件 1:Users.js
:
angular.module('users', []);
.controller('userController', [
'$scope',
'$http',
function($scope, $http, $routeParams) {
$http.get('data.json').success(function(data) {
$scope.userData = data;
});
}]);
文件 2:userService.json
[
{
'name': 'Bob Smith',
'age': 26,
'address': 'London',
},
{
'name': 'John Simpson',
'age': 41,
'address': 'New York',
},
{
'name': 'Maria West',
'age': 36,
'address': 'Chicago',
}
];
B 似乎更合乎逻辑(对我来说更容易),但我见过有人做 A。我认为这是一个优势 - 谁能解释一下?
是的,A 看起来是首选方法,因为它看起来有点遵循 separation of concern
,并遵循单一职责原则。
服务
- 负责从后端获取数据
- 向其他组件公开各种方法以从单个位置检索数据。
控制器
- 在服务和视图之间进行通信
- 它还处理其他视图特定的业务逻辑。
为什么方法 B 不好?
您在控制器内部进行了简单的 ajax 调用。是的,看起来真不错。
但是假设你想让 userData
显示在另外两个页面上,那么你会怎么做?我知道您也将在其他控制器中复制相同的代码。问题就在这里出现了。同样的事情会无缘无故地重复多次。正确的?因此,在多个地方复制代码将在未来增加 Code Maintainability
问题。这就是原因,你不应该选择第一种方法。
如果方法 A
会有更好的可维护性和结构化代码。
编辑
在您的 approach A
中,您不应该对所有数据进行硬编码。它应该通过调用服务器 API 方法或调用 .json
文件从服务器检索。另外我会写下正确的服务代码approach A
,你可以在这个解释结束后看到。通过查看重构代码,您现在可以看到我们已经摆脱了 $q
服务。因为您不需要像 $http
方法那样 return promise
担心自定义承诺的实现,通过使用哪些代码可以通过使用 .then
来遵循承诺链模式
angular.module('users').service('userService', ['$http', UserService]);
function UserService($http) {
return {
loadAllUsers : function() {
// Simulate async nature of real remote calls
return $http.get('users.json'); //return promise from herer
}
};
}
})();
两个选项,哪个更好,为什么:
示例 A。
- 应用模块
- 包含模型数据的服务
- 控制器从服务调用数据
文件 1:Users.js
:
angular.module('users', []);
文件 2:userService.js
:
angular.module('users').service('userService', ['$q', UserService]);
function UserService($q) {
var users = [
{
name: 'Bob Smith',
age: 26,
address: 'London',
},
{
name: 'John Simpson',
age: 41,
address: 'New York',
},
{
name: 'Maria West',
age: 36,
address: 'Chicago',
}
];
// Promise-based API
return {
loadAllUsers : function() {
// Simulate async nature of real remote calls
return $q.when(users);
}
};
}
})();
文件 3:UserController.js
:
angular.module('users').controller('UserController', ['$scope', function($scope) {
$scope.selected = null;
$scope.users = [];
$scope.selectUser = selectUser;
$scope.toggleList = toggleUsersList;
$scope.makeContact = makeContact;
userService
.loadAllUsers()
.then( function( users ) {
$scope.users = [].concat(users);
$scope.selected = users[0];
});
}]);
示例 B:
- 应用程序模块和控制器通过 $http 服务从 .json 文件绘制模型数据。
- json 保存模型数据的文件。
文件 1:Users.js
:
angular.module('users', []);
.controller('userController', [
'$scope',
'$http',
function($scope, $http, $routeParams) {
$http.get('data.json').success(function(data) {
$scope.userData = data;
});
}]);
文件 2:userService.json
[
{
'name': 'Bob Smith',
'age': 26,
'address': 'London',
},
{
'name': 'John Simpson',
'age': 41,
'address': 'New York',
},
{
'name': 'Maria West',
'age': 36,
'address': 'Chicago',
}
];
B 似乎更合乎逻辑(对我来说更容易),但我见过有人做 A。我认为这是一个优势 - 谁能解释一下?
是的,A 看起来是首选方法,因为它看起来有点遵循 separation of concern
,并遵循单一职责原则。
服务
- 负责从后端获取数据
- 向其他组件公开各种方法以从单个位置检索数据。
控制器
- 在服务和视图之间进行通信
- 它还处理其他视图特定的业务逻辑。
为什么方法 B 不好?
您在控制器内部进行了简单的 ajax 调用。是的,看起来真不错。
但是假设你想让 userData
显示在另外两个页面上,那么你会怎么做?我知道您也将在其他控制器中复制相同的代码。问题就在这里出现了。同样的事情会无缘无故地重复多次。正确的?因此,在多个地方复制代码将在未来增加 Code Maintainability
问题。这就是原因,你不应该选择第一种方法。
如果方法 A
会有更好的可维护性和结构化代码。
编辑
在您的 approach A
中,您不应该对所有数据进行硬编码。它应该通过调用服务器 API 方法或调用 .json
文件从服务器检索。另外我会写下正确的服务代码approach A
,你可以在这个解释结束后看到。通过查看重构代码,您现在可以看到我们已经摆脱了 $q
服务。因为您不需要像 $http
方法那样 return promise
担心自定义承诺的实现,通过使用哪些代码可以通过使用 .then
来遵循承诺链模式
angular.module('users').service('userService', ['$http', UserService]);
function UserService($http) {
return {
loadAllUsers : function() {
// Simulate async nature of real remote calls
return $http.get('users.json'); //return promise from herer
}
};
}
})();