检测AngularJS中服务和控制器之间的状态变化

时间:2013-11-06 14:46:01

标签: angularjs

我是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'触发,解雇或任何东西。如何广播或确保我捕获更改事件。

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

2 个答案:

答案 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)!');
});