[英]angular sharing data between controllers: service vs event
在控制器之間共享數據是否有任何一般經驗法則?
我已經看到了兩種如何實現這一目標的答案:
我不確定何時最好使用一種方法而不是另一種方法。
而且,關於方法#1,我真的不喜歡一件事。 這是一個從一些真實代碼中取出的玩具示例:
angular.module('profileService', [])
.factory('profileService',
[
function() {
var selectedProfile = { profileId: null };
return {
getProfile: function(profileId, callback) {
// marshall ajax request into format server will know how to handle
// ajax call to server
// marshall ajax response into format UI (controller) will know how to handle
},
createProfile: function(callback) { ... // ajax call to server ... },
updateProfile: function(callback) { ... // ajax call to server ... },
deleteProfile: function(callback) { ... // ajax call to server ... },
getSelectedProfile: function() {
return selectedProfile.profileId;
},
setSelectedProfile: function(profileId) {
selectedProfile.profileId = profileId;
},
};
}
]);
這似乎是糟糕的設計。 該服務(與我們的大部分服務一樣)用於轉換和向服務器發出請求。 我們的大部分服務都是無國籍的。 為測試等注入模擬服務是微不足道的......
但現在突然間我們的服務狀態。 這似乎是一個壞主意。
另一種方法可能是構建一個僅用於在控制器之間共享數據的服務(並且永遠不會進行后端調用),但這並不是所有的開胃菜。 它聞起來像一個提供全局命名空間的服務,看起來不是很棒的設計。
只是想知道,有沒有關於方法#1 vs#2的想法。 在服務中包含國家不一定是壞事嗎? 事件是一種更好的共享狀態方法嗎?
謝謝。
官方AngularJS控制器指南建議使用服務進行共享狀態:
不要使用控制器:
- 跨控制器共享代碼或狀態 - 改為使用角度服務。
使用服務來共享數據/狀態很好(webcam.isStreaming,socket.isConnected等),但“選擇”之類的東西不屬於profileService,例如可以有多個選擇。
事件不是用於共享狀態,而是用於......事件。 例如“includeContentLoaded”,“webcamReady”,“socketMessage”等。控制器可能沒有准備好(通過ng-include加載異步)並且錯過了一個事件。
方法3:您是否嘗試過UI路由器 ? 它是圍繞各州組織的。
您可以使用$ stateParams或resolve
來傳遞所選的配置文件。
其中一些也可以使用ngRoute,但非常有限。
方法4:您可以使用$scope
在父控制器和子控制器之間共享數據。
優點/缺點是選擇壽命與范圍相關。
這會產生一些耦合/復雜性,但不會超過profileSelectionsService。
如果父控制器寫入$ scope並且子控制器讀取,則工作得很好。 當兩個控制器都想寫入$ scope時,它會變得棘手
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.