如何确保回调只添加一次

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

本文关键字:添加 一次 回调 确保 何确保      更新时间:2023-09-26

我有一些这样的代码。

.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 控制器)。发生的情况是再次添加相同的回调。因此,在返回登录页面几次时,回调中的代码会被多次调用。

如何取消/删除离开/加载控制器时的回调?

谢谢!

公共布尔属性添加到 Auth 服务,该属性保存用户的身份验证状态。 用户通过身份验证后,将其设置为 true。

然后,在调用回调之前,请检查是否需要根据以前的值设置运行回调代码。

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

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

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

这是一个草图,但我希望你得到一般原则。