2015-11-02 64 views
0

我有兩個單獨的控制器:AuthController和NavController。 AuthController負責運行註冊/登錄表單,NavController負責顯示導航欄,我想顯示當前用戶名(如果有人登錄)。最後,我有服務「auth」處理所有註冊/登錄的東西刷新控制器中服務的數據

身份驗證服務具有這樣的功能:

auth.currentUser = function() { 
    if (auth.isLoggedIn()) { 
    var token = auth.getToken(); 
    var payload = this.decodeUsername(token); 

    return payload.username; 
    } 
}; 

和NavController看起來是這樣的:

app.controller('NavController', ['$scope', 'auth', 
function($scope, auth) { 
    $scope.isLoggedIn = auth.isLoggedIn; 
    $scope.logOut = auth.logOut; 
    $scope.currentUser = auth.currentUser(); 
} 
]); 

這樣我就可以顯示當前用戶名,但是如果用戶只需登錄NavController「不知道」塔沒有任何改變。我嘗試過使用事件,但是這兩個控制器沒有父子關係。我應該將它們包裝在一個父控制器中,並執行「AuthController-emit-> SuperController-broadcast-> NavController」,還是有更好的方法來在那裏交流兩個控制器?

+0

可能重複[Angular:控制器間共享數據](http://stackoverflow.com/questions/21919962/angular-share-data-between-controllers) – isherwood

+0

@isherwood AFAIK這將只適用於服務屬性,但我在這裏使用了getter方法 – tauruss85

回答

0

你有兩個選擇:

使用$rootScope.broadcastexample here),這會從上往下的每一個控制器發送事件。如果多件事情都想看到這個消息,這個效果最好。

或者,如果你只想要通知導航欄,你可以使用回調。

在您的身份驗證服務有一個被調用的狀態變化,如

authApi.stateChange = function() {} 

在您的導航欄控制器然後設置authApi.stateChange = $scope.authUpdated;,然後你authUpdated功能將從服務時通知authApi.stateChange()被調用函數

+0

$ rootScope.broadcast可以很好地工作。謝謝。 – tauruss85

0

當控制器之間有某些東西需要共享時,服務是實現結果的最佳方式。作爲單例,將只有一個實例,並且您的控制器 - 「Auth」 - 可以設置/更新值,「Nav」可以綁定到更改。

如果有一些提取涉及使用諾言。如果數據只會被提取一次,那麼你最好只使用諾言。

 auth.currentUser = function() { 
      var defer = $q.defer(); 
      if (auth.isLoggedIn()) { 
       var token = //some asynoperation//; 
       var payload = this.decodeUsername(token); 

       defer.resolve(payload.username); 
      }else{ 
       defer.reject("Not logged in"); 
      } 

      return defer.promise; 
}; 

(//千萬記得要注資$ Q)