1

我有一個大的複雜AngularJS Comet application(「實時」)。客戶端將數據發送到服務器,並從服務器接收有關其他用戶發起的事件的通知。AngularJS Comet(「實時」)應用程序雙向模塊間通信

在其最簡單的形式中,應用程序有這些客戶端組件(「服務」下方可以是AngularJS。服務或.factory,不管)

  • [Object] Controller:可以是任何對象,如StudentTeacherLessonDocument
  • [Object] Service:保持所述對象的模型,並具有的方法來對數據進行操作
  • Socket Service:包裝器套接字庫

呼叫可以走兩個方向

  • 用戶更新的東西>[Object] Controller>[Object] Service>Socket Service>服務器
  • 服務器>Socket Service>[Object] Service>[Object] Controller>通知用戶

什麼是最好的在這種情況下雙向模塊間通信的架構?

以下是我認爲的選項。如果我把它們排除在外,請提出其他好的建議。

  1. 使用circular dependency fudge。我看到的所有地方似乎都不應該這樣做,包括Lu4在他的「軟弱」答案中。另一方面,這樣做意味着您可以在兩個方向上進行方法調用,從而在整個應用程序中保持模塊間通信的一致性。
  2. 在一個方向使用依賴注入和方法調用,而在另一個方向使用方向調用。有someopposition過度使用事件。這是一個過度使用的情況嗎?
  3. 在兩個方向使用事件。更接近「過度使用」,但在整個應用程序中保持模塊間通信的一致性。
  4. 使用Mediator pattern,即有一箇中央協調服務,在兩個方向上進行協調。我不確定這與使用事件有什麼不同或更好,其中$ rootScope成爲註冊所有事件及其回調的「中介」。
  5. 某種類型的模塊之間的長輪詢的,因此,如[Object] Controller使得以[Object] Service調用,它返回一個承諾,依次調用Socket Service也返回一個承諾,當Socket Service接收的一些數據,承諾解決回上鍊,此時[Object] Controller發起另一個請求。

回答

1

乾淨的解決方案是將經典DI用於用戶啓動的方向。由於您的[對象]服務包含模型,您只需要更新該模型(如果您的實現是乾淨的,即您在任何地方都使用注入的模型對象)。

所以這個問題已經減少到如何從套接字服務獲取新的更新到[Object]服務。由於你的套接字服務實際上不應該知道你的模型細節注入模型不是一個合理的解決方案(不要留下如此創建的循環依賴)。從服務器接收客戶端應用程序中的任何更新的定義都是事件(隨時可能發生),所以我認爲在SocketService中獲取$RootScope並將其廣播是非常合理的。在此事件中,您的[對象]服務不需要根據新信息更新模型。

如果您有很多服務,並且通常服務器啓動的事件只與其中一個或幾個相關,則可能的優化是從服務器發送一個字段,這些字段受到此更新的影響。這是合理的,因爲服務器已經知道模型,並且它使Socket服務能夠在不知道xxx的含義的情況下廣播updateFor:xxx事件。然後相應的[Object]服務僅偵聽updateFor:[Object]事件。但是,一如既往的優化,如果簡單的方法已經適用於您,請不要執行它們。

+0

「從服務器接收客戶端應用程序中的任何事情的更新都是在事件的定義中定義的。但是用戶事件也是如此,因此''(「#clickme」)。on(「click」,...'在jQuery等等。爲什麼在整個事件中使用事件並不是「乾淨」的?這很簡單。 – poshest 2014-10-07 08:43:25

+0

我不會實際上,恕我直言,使用angular的主要原因之一是雙向綁定,但它們必須使用控制器來設置,Angular僅使用' $ scope'作爲粘合劑,它確實沒有提供任何類型的模型控制器,它可以用來將模型綁定到發出事件的數據源上,這很好,因爲大多數web應用程序都是基於turn的('$ HTTP'-服務可以很好地隱藏「就緒」或「失敗」事件,這些事件與隨時可能發生的事件根本不同)。 – 2014-10-07 14:08:05

+0

AngularJS沒有提供「模型控制器,可用於將模型綁定到數據源」無論如何!我不打算放棄雙向綁定,但是想象一下調用'$ scope.addNewT eacher「,而不是執行'$ http'的套接字版本,它返回promise和all,只是發出一個事件,如果新教師來自服務器,則可以由套接字服務發出的SAME事件。不需要編寫依賴於完全不同技術的兩個不同的addNewTeacher函數。 – poshest 2014-10-07 18:24:10