2014-07-18 36 views
0

我有一個應用程序,可以在所有控制器註冊後手動引導。然後我希望看到當用戶登錄時,他們的帳戶已被驗證。不幸的是,我的範圍監聽器無法正常工作,無法捕捉到我的登錄控制器發出的廣播。我的帳戶驗證的代碼波紋管:

class CMSAccountCtrl 

    constructor: (@$scope, @$rootScope, @$location, @$http, @APGlobalState) -> 
    console.log @$scope 
    @$scope.$on 'CMSAccountCtrl-verify', (event, value) => 
     console.log 'cms account ctrl should have verified' 
     @verify() 

    @$scope.verify =() => 
     @verify() 

    verify:() => 
    @$http({ 
     'method': 'POST' 
     'url': "#{window.ap_base_uri}/caas/account/verify" 
     'data': { 
      'apCookie': @APGlobalState.get 'cookie' 
     } 
     }).success((data, status, headers, config) => 
     # Do something 
     console.log(data) 
     if data.isVerified == 'yes' 
      @$rootScope.$broadcast 'CMSLoginCtrl-showToolbar' 
     else 
      @$scope.alert = { 
      msg: "You're account as not been verified. Please re-check your email." 
      } 
    ).error((data, status, headers, config) => 
     # Do somethings 
    ) 



if !window.apInject? 
    window.apInject = {} 

if !window.CMSControllers? 
    window.CMSControllers = {} 

# This executes before bootstrap, but after angular.module 'myModule', [] 
window.apInject.CMSAccountCtrl = (app) -> 
    app.controller 'CMSAccountCtrl', [ 
    '$scope' 
    '$rootScope' 
    '$location' 
    '$http' 
    'APGlobalState' 
    CMSAccountCtrl 
    ] 

window.CMSControllers.CMSAccountCtrl = CMSAccountCtrl 

奇怪的是,我的@ $ $範圍上「監聽器」適用於一些我的控制器,但無法爲他人,即使他們都實現了相同的結構。爲什麼我的聽衆不註冊?

回答

0

您可以$發送事件或$廣播事件。兩者之間的區別在於$ emit將向範圍層次結構分派事件。然而,$ broadcast將向下派發事件到其子範圍。

在您的場景中,當我們的$ scope。$ broadcast不工作​​時,請嘗試執行$ scope。$ emit,因爲接收器將處於向上水平。

+0

你已經改變了$ broadcast和$ emit的作用。廣播下降,發射。 – Chandermani

+0

感謝@Chandermani指出。 – V31

0

這一切都取決於你是如何控制器,因此範圍設置。廣播從它被調用的範圍下降,從它被調用的範圍發射出去。

如果您的登錄名和CMSAccount控制器不共享相同的作用域分層結構(父 - 子),即既不是$ scope。$ emit或$ scope。$ boadcast也可以。在這種情況下,您需要使用$ rootScope。$ broadcast並且訂戶可以使用$ scope。$ on。

您還必須確保控制器在事件發佈時已經加載,否則控制器將永遠不會收到郵件。例如,如果事件是從一個ng-view部分引發的,並由另一個ng-view訂閱的,它將不會工作。