正在刷新控制器中服务的数据



我有两个独立的控制器: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"不知道"有什么变化。我尝试过使用event,但这两个控制器没有父子关系。我应该将它们封装在一个父控制器中并执行"AuthController发射->SuperController广播->NavController",还是有更好的方法在两个控制器之间进行通信?

您有两个选项:

使用$rootScope.broadcast(这里的示例),这将从上到下向每个控制器发送一个事件。如果有多个对象希望看到此消息,则此操作效果最佳。

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

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

authApi.stateChange = function() {}

然后在导航栏控制器中设置authApi.stateChange = $scope.authUpdated;,当authApi.stateChange()被调用

时,服务将通知您的authUpdated功能

当控制器之间有要共享的东西时,服务将是实现结果的最佳方式。作为其单例,将只有一个实例,并且您的控制器"Auth"可以设置/更新值,"Nav"可以绑定到更改。

如果涉及到一些抓取,请使用promise。如果数据只会被提取一次,那么你最好只使用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)

最新更新