0

我对 AngularJS 完全陌生,我有一个小问题,请注意,我仍处于 AngularJS 开发的最初几周,我仍然不了解所有内容,所以请不要笑。

好的,我有一个身份验证模块,其中包含我调用的服务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!');
});

我将我的应用程序视为公共用户,然后登录(登录表单只是应用程序顶部的一个视图,我在 using 中导入ng-view$scope.$watch('isAuthenticated'......没有被触发、解雇或任何事情。如何广播此内容或确保捕获更改事件。

如果无法提供答案,请随时向我点头以正确的方向进行调查(如主题或开发领域)。我意识到我的代码示例非常糟糕。

4

2 回答 2

1

正如实现的那样,$scope.isAuthenticated在初始化时接收一个值并永远保留它。所以$watch不会再次触发,因为被监视的表达式永远不会改变!由于authService.isAuthenticated()很快,你可以直接观看:

$scope.$watch(
    function() { return authService.isAuthenticated(); },
    function(newval, oldval) {
        // state changed
    }
);
于 2013-11-06T14:57:58.220 回答
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)!');
});
于 2013-11-06T15:08:14.877 回答