繁体   English   中英

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

[英]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控制器再次被调用)。 发生的是再次添加了相同的回调。 因此,几次返回登录页面后,回调中的代码将被多次调用。

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

谢谢!

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM