两个选项,哪个更好,为什么:
示例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:
文件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.我认为这有优势 - 任何人都可以解释它吗?
答案 0 :(得分:6)
是的,A看起来更受欢迎,因为它看起来像separation of concern
,遵循单一责任原则。
服务
<强>控制器强>
你在控制器本身内有简单的ajax调用。雅看起来真的很好。
但是假设你想让userData
显示在另外两页上,那么你会做什么?我知道你也会在其他控制器中复制相同的代码。这里的问题出现在图片中。同样的事情将无缘无故地重复多次。正确?因此,在多个位置复制代码将在未来添加Code Maintainability
问题。这就是原因,你不应该先采取行动。
接近A
的方法可以更好地维护&amp;结构化代码。
修改强>
在approach A
内,您不应该对所有数据进行硬编码。它应该通过调用服务器API方法或调用.json
文件从服务器检索。此外,我将写下正确的服务代码approach A
,您可以在此解释结束后看到。通过查看重构代码,您可以看到我们现在已经摆脱了$q
服务。因为您不需要担心自定义承诺的实现,因为$http
方法确实返回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
}
};
}
})();