我有一個「帳戶」服務,充當多個控制器和視圖中使用的集中式數據存儲。除了getter和setter方法之外,該服務還會保存與兩種類型的用戶相關的所有數據,即登錄用戶和匿名用戶。AngularJS。有關正確的雙向數據綁定服務的最佳實踐
這個服務背後的想法是,它應該被用作一個集中的數據結構,它將保持所有相關的視圖和控制器同步。例如:如果用戶登錄,將會知道他的電子郵件,並且所有'新聞訂閱'字段都可以預先填好。
我使用的當前設置如下。請注意,服務器上的每個異步調用都會返回一個承諾。
// 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結合我們的數據()。屬性我們認爲它會保持同步,我們整個應用程序。
如果沒有定義.UserName值,或者如果在不合用戶的情況下根本沒有帳戶數據,上面的代碼也會拋出。解決這個問題的一個方法是使用空值將我們的'模板'對象'轉儲'到我們的服務中,這將確保鍵/值存在。另一種方法是使用觀察者,並讓我們的控制器'寫'給我們的服務,以防用戶填寫一個字段。
第一個選項給了我更多的靈活性,因爲我可以集中服務中的所有數據綁定,但它感覺骯髒,因爲您永遠不知道服務器數據會發生什麼,它可能會以不同的格式進來。
有沒有人有任何其他解決方案?我寧願不讓我的控制器將數據寫入服務。
謝謝你的時間!
THX的鏈接! – chris