我是AngularJS的新手,我有一个小问题,请注意我仍然在AngularJS开发的前几周,我仍然不明白一切所以请不要笑。
好的,我有一个Auth模块,其中包含我呼叫authService
的服务。在authService
内,我设置值this.isAuthenticated
以确定用户是否已登录,这是一个简单的示例(我已删除了所有内容,因为它正常工作。
this.isAuthenticated = function () {
// i have removed a great deal of code to keep this simple but we use $http and a rest service...
// more code then ...
if (loggedInUser == null) {
return false;
} else {
return true;
}
};
在另一个名为ideasCtrl
的控制器中,我想检查用户是否登录,我希望观察是否有状态变化,以便我可以采取相应行动...这是我的ideasCtrl
// please note that authService is correctly injected / referenced
$scope.isAuthenticated = authService.isAuthenticated();
console.log($scope.isAuthenticated);
$scope.$watch('isAuthenticated', function() {
console.log('hey, isAuthenticated has changed!');
});
我以公共用户的身份查看我的应用,然后登录(登录表单只是我使用ng-view
导入的应用顶部的视图)$scope.$watch('isAuthenticated'
... isn'触发,解雇或任何东西。如何广播或确保我捕获更改事件。
如果无法提供答案,请随时给我一个正确的方向来点头调查(如主题或开发区域)。我意识到我的代码示例非常糟糕。
答案 0 :(得分:1)
实现后,$scope.isAuthenticated
会在初始化时收到一个值,并永久保留它。所以$watch
不再被触发,因为观察到的表达式永远不会改变!由于authService.isAuthenticated()
很快,您可以直接观看:
$scope.$watch(
function() { return authService.isAuthenticated(); },
function(newval, oldval) {
// state changed
}
);
答案 1 :(得分:0)
正如@Nikos所指出的那样,您只需拨打authService.isAuthenticated()
一次,$scope.isAuthenticated
就不会改变,$watch
将不会做任何事情。但是,如果authService
取决于您提到的API调用,则不希望重复运行它。我建议在不同的身份验证事件上发出事件并在控制器中监听它们。例如,在服务中的登录事件中,您可以执行以下操作:
$rootScope.$broadcast("auth:login");
然后在你的控制器中:
$scope.$on('auth:login', function() {
console.log('hey, isAuthenticated has changed (user logged in)!');
});