我有一个“帐户”服务,它充当多个控制器和视图中使用的集中数据存储。除了 getter 和 setter 方法之外,该服务将保存与两种类型的用户相关的所有数据,即登录用户和异常用户。
这个服务背后的想法是它应该被用作一个集中的数据结构,它将使所有相关的视图和控制器保持同步。例如:如果用户登录,他将知道他的电子邮件,并且所有“新闻订阅”字段都可以预先填写。
我使用的当前设置如下。请注意,服务器上的每个 Async 调用都将返回一个 Promise。
// The Service
angular.module('A').provider('AccountService', [function() {
this.$get = function ($resource) {
var Account = {
getLoggedInAccountAsync : function () {
var Account = $resource(WebApi.Config.apiUrl + 'Account/Get');
return Account.get();
},
getUserData : function () {
return Account.userData;
},
setUserData : function (accountData) {
var merge = angular.extend((Account.currentAccountData || {}), accountData);
Account.currentAccountData = merge;
}
};
return Account;
}
});
// Our main app controller. Get's fired on every page load.
angular.module('A').controller('MainController', ['AccountService', function (AccountService) {
var loggedInAccount = AccountService.getLoggedInAccountAsync();
loggedInAccount.$then(loggedInAccountPromiseResolved);
function loggedInAccountPromiseResolved (response) {
if (response.data.isLoggedIn) {
AccountService.setAccountData(response.data);
}
};
return $scope.MainController= this;
}])
// Our specific controller. For example a newsletter subscription.
angular.module('A').controller('SpecificController', ['AccountService', function (AccountService) {
this.getUserData = AccountService.getUserData;
return $scope.Controller = this;
}])
// Newsletter subscription view
<input id="email" type="email" name="email" ng-model="SpecificController.getUserData().UserName"/>
使用上面的代码可以确保每当我们使用服务通过 Controller.getUserData().property 将我们的数据绑定到我们的视图时,它将在整个应用程序中保持同步。
如果例如未定义 .UserName 值,或者在异常用户的情况下根本没有帐户数据,上面的代码也会抛出。解决这个问题的一种方法是在我们的服务中使用空值“转储”我们的“模板”对象,这将确保键/值存在。另一种方法是使用观察者并让我们的控制器“写入”我们的服务,以防用户填写字段。
第一个选项给了我更大的灵活性,因为我可以将所有数据绑定集中在服务中,但感觉很脏,因为你永远不知道服务器数据会发生什么,例如它可能以不同的格式出现。
有没有人有任何其他的解决方案?我宁愿不让我的控制器将数据写入服务。
感谢您的时间!