簡體   English   中英

控制器之間的角度共享數據:服務與事件

[英]angular sharing data between controllers: service vs event

在控制器之間共享數據是否有任何一般經驗法則?

我已經看到了兩種如何實現這一目標的答案:

  1. 將服務注入到將包含共享數據的兩個控制器中
  2. 使用$ scope。$ broadcast('someEvent',sharedArg)和$ scope。$ on('someEvent',sharedArg)

我不確定何時最好使用一種方法而不是另一種方法。

而且,關於方法#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM