2013-11-27 125 views
4

我已經告訴採用了棱角分明的事件可能是昂貴的(我一直無法驗證)

與工廠或服務應該是「包裝」,以$broadcast$on任何調用注入到其相應的組件保持表現?

再次,我寧願使用$on,並直接監聽被解僱的事件,而不是創建一個工廠,實質上只是在接收事件時註冊函數來調用 - 讓我們稱之爲調度器。

請注意,它不只是一個監聽'some-event'的組件(指令),會有多種組件監聽這個事件。

實例調度員:

angular.module('app').factory('dispatcher', ['$rootScope', function ($rootScope) { 

    var registeredFns = [ ]; 

    $rootScope.$on('some-event', function (evt, msg) { 
     _.each(registeredFns, function (fn) { 
      fn.apply(null, msg); 
     }); 
    }); 

    return { 
     onSomeEvent: function (fn) { 
      registeredFns.push(fn); 
     } 
    }; 
}); 

而且,我需要它注入了 - 也許一個指令,也許控制器在以往任何時候都無所謂。

+3

創建性能測試** http://jsperf.com**並更新您發現的內容 – charlietfl

+0

服務將確保您以懶惰方式添加偵聽器;所以你只需要時聽。但我不擔心這一點。過早優化。 – Blaise

+0

@Blaise絕對同意。至於perf我會當我得到一些時間:) –

回答

6

他們也不貴......但他們潛在昂貴的,如果他們濫用(如在生活中別的 - 這聽起來像一個善意的玩笑開始!)

這是重要的是要了解這裏實際發生的事情,code其實很簡單。如果調用$ emit(),它只是在已註冊監聽器數組中循環並調用每個監聽器。它在您首次調用它的範圍上執行此操作,然後向上「走」每個父級,直到它到達$ rootScope。

有一些額外的代碼來處理像stopPropagation這樣的事情,但除此之外就是這樣。

$廣播做了類似的事情,但方向相反:它爲()循環執行此操作,但每遍子代範圍。這是一個超級重要的區別,因爲如果你做了一個$rootScope.$broadcast(),並且你有很多ngRepeats和指令浮動,你可能會做出比預期更多的工作 - 即使沒有這些範圍監聽這個事件,Angular仍然必須通過他們所有人來弄清楚。

如果您想要在jsPerf或類似軟件中執行最快的可能測試,您的最快使用案例是使用$rootScope.$emit()$rootScope.$on()。這會給你一個基本信息傳遞的單一範圍測試,你可以從那裏開始。

+0

非常明確的解釋。但是,我想知道在哪種情況下,使用$ rootScope。$ broadcast()+ $ scope。$ on比$ rootScope。$ emit()+ $ rootScope。$ on()更好(更充分) – marsop