我有两个独立的控制器: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"或者有更好的方式与两个控制器进行通信?
答案 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.broadcast
(example here),这会从上到下向每个控制器发送一个事件。如果多个事情想要看到此消息,这种方法效果最好。
或者,如果您只想通知导航栏,则可以使用回调。
在您的身份验证服务中有一个函数可以在状态更改时调用,例如
authApi.stateChange = function() {}
在您的导航栏控制器中,然后设置authApi.stateChange = $scope.authUpdated;
,然后在调用authUpdated
时通知您的authApi.stateChange()
函数