【发布时间】:2015-06-18 10:14:04
【问题描述】:
我偶然发现了一个应该很常见且显而易见的问题,但我似乎无法理解它。
我正在开发一个小型原型应用程序。我的后端开发人员在 JSON 对象中为我提供了配置文件数据。比方说,它看起来像这样:
profile = {Name: 'John', Email: 'john@mail.com', DOB: '1980-11-03'}
我在多个位置都需要这些值,而且我也不想将后端 http 调用放在控制器中,所以我创建了一个服务来处理这个:
angular.module('app', [])
.service('ProfileService', ['$http', function ($http) {
var service = this;
service.Name = null;
service.Email = null;
service.DOB = null;
service.getProfile = function () {
return $http.get('/profile').then(function (response) {
service.Name = response.data.Name;
service.Email = response.data.Email;
service.DOB = response.data.DOB;
return true;
});
};
return service;
}])
.controller('ProfileCtr', ['ProfileService', function (service) {
var vm = this;
service.getProfile().then(function () {
vm.Name = service.Name;
vm.Email = service.Email;
vm.DOB = service.DOB;
});
}]);
这个解决方案有很多问题:
- 由于配置文件数据由原语组成,直接绑定到服务属性不会自动同步数据。
- 更重要的是,它打破了 DRY 概念,因为我已经在至少 3 个不同的地方(数据库架构、getProfile() 和控制器中)编写了数据声明。
一种解决方案是添加一个间接层并在服务中创建一个对象:
angular.module('app', [])
.service('ProfileService', ['$http', function ($http) {
var service = this;
service.profile = {};
service.getProfile = function () {
return $http.get('/profile').then(function (response) {
for (key in response.data) {
service.profile[key] = response.data[key];
};
return true;
});
};
return service;
}])
.controller('ProfileCtr', ['ProfileService', function (service) {
var vm = this;
service.getProfile().then(function () {
vm.profile = service.profile;
});
}]);
这通常有效,但现在我得到了笨拙的 controllerAs 语法:
<div ng-controller="ProfileCtr as ctr">
<h1> {{ ctr.profile.Name }}</h1>
<p> Email: {{ ctr.profile.Email }} <br /> DOB: {{ ctr.profile.DOB }}</p>
</div>
我想知道是否有一种方法可以同时满足我的要求:干净的 HTML {{ ctr.Name }} 语法 和
一种 DRY 编程风格。
感谢任何提示!
【问题讨论】:
-
服务臃肿且没有必要的代码。您不需要
= null语句,并且从http,只需使用,返回result.data;然后使用:service.getProfile().then(function (result) {
标签: javascript angularjs dry