从控制器

时间:2015-11-02 21:27:09

标签: angularjs

我有两个独立的控制器:AuthController和NavController。 AuthController负责运行注册/登录表单,NavController负责显示导航栏,如果有人登录,我想显示当前的用户名。最后,我有服务" auth"处理所有注册/登录的东西

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"或者有更好的方式与两个控制器进行通信?

2 个答案:

答案 0 :(得分:0)

当控制器之间有共享内容时,服务将是实现结果的最佳方式。作为它的单身人士,只有一个实例,而你的控制器 - ' Auth' - 可以设置/更新值,'导航'可以绑定到更改。

如果有一些提取涉及使用承诺。如果数据只被提取一次,那么你最好只使用promise。

        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)

答案 1 :(得分:0)

您有两种选择:

使用$rootScope.broadcastexample here),这会从上到下向每个控制器发送一个事件。如果多个事情想要看到此消息,这种方法效果最好。

或者,如果您只想通知导航栏,则可以使用回调。

在您的身份验证服务中有一个函数可以在状态更改时调用,例如

authApi.stateChange = function() {}

在您的导航栏控制器中,然后设置authApi.stateChange = $scope.authUpdated;,然后在调用authUpdated时通知您的authApi.stateChange()函数