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

时间:2015-01-06 15:59:33

标签: javascript angularjs firebase angularfire

我有一些像这样的代码..

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

然后在调用回调检查之前,如果基于之前的值设置,则需要运行回调代码。

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

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

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

这是一幅素描,但我希望你能得到一般原则。