我有一個大的複雜AngularJS Comet application(「實時」)。客戶端將數據發送到服務器,並從服務器接收有關其他用戶發起的事件的通知。AngularJS Comet(「實時」)應用程序雙向模塊間通信
在其最簡單的形式中,應用程序有這些客戶端組件(「服務」下方可以是AngularJS。服務或.factory,不管)
[Object] Controller
:可以是任何對象,如Student
,Teacher
,Lesson
,Document
[Object] Service
:保持所述對象的模型,並具有的方法來對數據進行操作Socket Service
:包裝器套接字庫
呼叫可以走兩個方向
- 用戶更新的東西>
[Object] Controller
>[Object] Service
>Socket Service
>服務器 - 服務器>
Socket Service
>[Object] Service
>[Object] Controller
>通知用戶
什麼是最好的在這種情況下雙向模塊間通信的架構?
以下是我認爲的選項。如果我把它們排除在外,請提出其他好的建議。
- 使用circular dependency fudge。我看到的所有地方似乎都不應該這樣做,包括Lu4在他的「軟弱」答案中。另一方面,這樣做意味着您可以在兩個方向上進行方法調用,從而在整個應用程序中保持模塊間通信的一致性。
- 在一個方向使用依賴注入和方法調用,而在另一個方向使用方向調用。有someopposition過度使用事件。這是一個過度使用的情況嗎?
- 在兩個方向使用事件。更接近「過度使用」,但在整個應用程序中保持模塊間通信的一致性。
- 使用Mediator pattern,即有一箇中央協調服務,在兩個方向上進行協調。我不確定這與使用事件有什麼不同或更好,其中$ rootScope成爲註冊所有事件及其回調的「中介」。
- 某種類型的模塊之間的長輪詢的,因此,如
[Object] Controller
使得以[Object] Service
調用,它返回一個承諾,依次調用Socket Service
也返回一個承諾,當Socket Service
接收的一些數據,承諾解決回上鍊,此時[Object] Controller
發起另一個請求。
「從服務器接收客戶端應用程序中的任何事情的更新都是在事件的定義中定義的。但是用戶事件也是如此,因此''(「#clickme」)。on(「click」,...'在jQuery等等。爲什麼在整個事件中使用事件並不是「乾淨」的?這很簡單。 – poshest 2014-10-07 08:43:25
我不會實際上,恕我直言,使用angular的主要原因之一是雙向綁定,但它們必須使用控制器來設置,Angular僅使用' $ scope'作爲粘合劑,它確實沒有提供任何類型的模型控制器,它可以用來將模型綁定到發出事件的數據源上,這很好,因爲大多數web應用程序都是基於turn的('$ HTTP'-服務可以很好地隱藏「就緒」或「失敗」事件,這些事件與隨時可能發生的事件根本不同)。 – 2014-10-07 14:08:05
AngularJS沒有提供「模型控制器,可用於將模型綁定到數據源」無論如何!我不打算放棄雙向綁定,但是想象一下調用'$ scope.addNewT eacher「,而不是執行'$ http'的套接字版本,它返回promise和all,只是發出一個事件,如果新教師來自服務器,則可以由套接字服務發出的SAME事件。不需要編寫依賴於完全不同技術的兩個不同的addNewTeacher函數。 – poshest 2014-10-07 18:24:10