如何确保只添加一次回调?

How do I make sure a callback is only added once?

我有一些这样的代码..

.factory('Auth', function($firebaseAuth) {
var ref = new Firebase('https://myfirebase.firebaseio.com');
return $firebaseAuth(ref);
})

和控制器

.controller("LoginCtrl", function($scope, Auth, $timeout) {
function authDataCallback(authData) {
    $timeout(function() {
        console.log(Auth);
        $scope.user = authData;

        if (authData) {    
            console.log("Authentication ok.");
        }
    });
}

$scope.auth = Auth;
console.log("Adding a new callback in login");
$scope.auth.$onAuth(authDataCallback);
...

在我的应用程序中,访问者可能会被重定向回登录页面(并且会再次调用此 LoginCtrl 控制器)。发生的情况是再次添加相同的回调。所以在多次返回登录页面时,回调中的代码被调用了多次。

如何 cancel/delete leaving/loading 控制器上的回调?

谢谢!

向您的 Auth 服务添加一个 public 布尔值 属性,它保存用户的身份验证状态。用户通过身份验证后将其设置为 true。

然后在您调用回调之前检查是否基于先前的值设置是否需要 运行 回调代码。

if (!Auth.isUserAuthenticated) {
   $scope.auth.$onAuth(authDataCallback);
}

我不得不说,我可以向您展示从 lodash 或其他地方将函数强制 运行 一次的模式,但真正的问题是控制器与服务等不同,它们不是单例并且表达式 运行 在摘要循环期间至少一次,并且摘要循环不是一次性过程。您的问题是架构性的,因为您的控制器拥有的逻辑不仅仅是管理行为。

您需要确保应用的所有主要业务逻辑都在服务内部,并且控制器仅通过调用这些服务的方法或从中读取状态来管理它们自己的行为。

这是一个草图,但我希望你能理解一般原则。