为什么$ firebaseSimpleLogin:logout事件不止一次执行alert()?

时间:2014-05-10 15:03:13

标签: javascript angularjs firebase firebase-security

我正在尝试理解为什么此代码执行警报()3次:

$scope.logout = function () {
    $rootScope.auth.$logout();
    $rootScope.$on('$firebaseSimpleLogin:logout', function(event) {
       alert("Logged out"); // This appears 3 times.
    });
} 

但这只是一个:

$scope.logout = function () {
    $rootScope.auth.$logout();
    alert("Logged out"); // This JUST appears once.
}

据我所知,第二种方法是直接的;首先执行一行,然后执行另一行。但是,如果$ logout失败并且应用程序显示操作成功,那么该怎么办呢?由于这种可能性,我正在使用$firebaseSimpleLogin:logout事件来正确处理这种情况。可悲的是,它没有像我想象的那样工作。

可能有什么不对?

1 个答案:

答案 0 :(得分:1)

很难说没有看到应用程序的其余部分,但是有一个错误:在第一个代码示例中,每次调用$scope.logout时都会附加另一个事件侦听器 - 例如,如果您调用两次,下次事件发生时它会发出警报两次。再次单击它,下次事件触发时,您将收到三个警报。您应该在函数调用之外移动事件侦听器的注册:

// put this anywhere that's only called once

app.run(function($rootScope) {
  $rootScope.$on("$firebaseSimpleLogin:logout", ...);
});

// elsewhere

$scope.logout = function() {
  $rootScope.auth.$logout();
};



// You could also unregister the function when you're done with it instead

app.controller("AuthController", function($scope, $rootScope) {
  var unregListener = $rootScope.$on("$firebaseSimpleLogin:logout", ...);
  $scope.$on("$destroy", unregListener);

  $scope.logout = function() { ... };
});