我有AuthService
并希望在某些控制器中使用此服务。
我想在我的前端显示或隐藏“注销”按钮,取决于$ scope.isLoggedIn。
我的前端代码:
<md-button ng-if="isLoggedIn" class="md-button" ng-click="signOut()" aria-label="Logout">
Logout
</md-button>
和我的signOut()
功能:
$scope.signOut = function() {
AuthenticationService.signOut().then(function() {
$location.path('/');
});
};
身份验证服务包含以下功能:signIn()
,signOut()
和字段.isLoggedIn = true|false
。
我想在控制器中更新我的变量,$scope.isLoggedIn
取决于AuthenticationService.isLoggedIn。但如果我试试这个:
$scope.isLoggedIn = AuthenticationService.isLoggedIn
它工作正常,但只有当我加载网站时。因此,如果用户已登录,则变量$scope.isLoggedIn
为true
,如果用户未登录变量$scope.isLoggedIn
,则为false
。
但如果AuthenticationService.isLoggedIn
在应用程序运行时发生更改,则不会更改$scope.isLoggedIn
。
是否可以在服务和控制器之间保留此引用?或者我应该以另一种方式做到这一点?
答案 0 :(得分:3)
你必须这样做:
$scope.authService = AuthenticationService;
在您看来,请通过以下方式访问它:
authService.isLoggedIn
你当前的方式不起作用的原因是你最初设置一个布尔值,一个值类型,而不是像对象一样的引用类型。因此,当更新isLoggedIn时,您的范围变量不知道。当您将其设置为对象时,在您的情况AuthenticationService
中,将保留对该对象的引用,并且任何更新都会反映在视图中。
答案 1 :(得分:1)
在控制器中使用 $ watch
$scope.$watch(function(){return AuthenticationService.isLoggedIn}, function(newval, oldval){
$scope.isLoggedIn = newval;
});
答案 2 :(得分:1)
简单地将其变成一个函数:
$ scope.isLoggedIn
$ scope.isLoggedIn = function(){return AuthenticationService.isLoggedIn;}