Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何关闭工厂方法中的eventlistener,该方法将承诺返回给控制器?_Javascript_Angularjs_Event Handling_Firebase_Firebasesimplelogin - Fatal编程技术网

Javascript 如何关闭工厂方法中的eventlistener,该方法将承诺返回给控制器?

Javascript 如何关闭工厂方法中的eventlistener,该方法将承诺返回给控制器?,javascript,angularjs,event-handling,firebase,firebasesimplelogin,Javascript,Angularjs,Event Handling,Firebase,Firebasesimplelogin,我有一个loginService工厂,用于执行登录、注销并向控制器提供用户数据。因为我需要在每次loginstate更改时更新控制器中的userdata,所以我的factory方法将返回更新承诺: app.controller('TestCtrl', function ($scope, loginService) { loginService.currentUserData().then(null, null, function(CurrUserData){ $scope

我有一个loginService工厂,用于执行登录、注销并向控制器提供用户数据。因为我需要在每次loginstate更改时更新控制器中的userdata,所以我的factory方法将返回更新承诺:

app.controller('TestCtrl', function ($scope, loginService) {
    loginService.currentUserData().then(null, null, function(CurrUserData){
        $scope.CurrUserData = CurrUserData;
    });
});
在loginService中,我正在侦听$firebaseSimpleLogin:login/logout事件,在触发这些事件后,我将userdata对象(由基于UID的函数返回)或null($fbSimpleLogin:logout事件)传递给$emit。 最后,在我的loginService.currentUserData()方法中,我监听这个发出的事件并返回deferred.notify(userdata/null)

第一个问题是,当我更改视图(模板+ctrl+location)时,我需要调用$firebaseSimpleLogin:login/logout事件将我的用户数据传递给新的控制器。现在,我通过$locationChangeStart事件来做,但应该有更好的方法

最后一个问题:当我更改视图时,数据调用比我预期的要多。 可能每个控制器都会通过调用loginService.currentUserData()在$rootScope上添加事件侦听器?描述代码如下:

$rootScope.$on('$firebaseSimpleLogin:login', function (e, authUser) {
    findUserByUid(authUser.uid);
});
$rootScope.$on('$firebaseSimpleLogin:logout', function() {
    $rootScope.$emit('userLogout', null);
});
$rootScope.$on('$locationChangeStart', function(event, next, current) { 
    currentUser().then(function(u){ 
        $timeout(function() { // without this same event on viewchange is fired
// by simplelogin, collision (I need to replace this whole block with invoking simpleloginevent)
            if (u) {$rootScope.$emit('$firebaseSimpleLogin:login', u);
            } else {$rootScope.$emit('$firebaseSimpleLogin:logout', null);};
        }, 150);
    });
});
function findUserByUid (uid) {
    var query = $firebase(usersRef.startAt(uid).endAt(uid));
    query.$on('loaded', function () {
        var username = query.$getIndex()[0];
        setCurrentUser(username);
    });
}
function setCurrentUser (username) {
    if (username) {$rootScope.$emit('userData', $firebase(usersRef).$child(username));};
}
var currentUserData = function () { // this method is used in CTRLs
    var deferred = $q.defer();
    var uDl = $rootScope.$on('userData', function(e, FbUserData){deferred.notify(FbUserData); });
    var uLl = $rootScope.$on('userLogout', function(){deferred.notify(null); });
    return deferred.promise;
};

我最近编写了一个演示AngularFire应用程序,它具有类似的功能。我发现处理这件事的方法只是担心三点

  • 当用户登录(“$firebaseSimpleLogin:$login”)时,
    $rootScope.$on(“$firebaseSimpleLogin:$login”)

  • 当用户注销时(“$firebaseSimpleLogin:$logout”)

  • 调用
    $getCurrentUser()

  • 这将能够捕获登录生命周期。因为您需要知道当前用户是谁,所以可以依赖$firebaseSimpleLogin方法,而不是尝试$emit您自己的事件

    您还可以在$routeProvider中为每个视图解析当前用户。这样,在加载用户之前,不会呈现每个视图

    以下是plunker项目和示例工厂:


    非常感谢!这对我还不起作用,但你给了我正确的处理方法。现在,我正在努力在
    $firebaseSimpleLogin:login/logout
    上添加多个事件侦听器。我将学习OOP的一些知识,它一定会起作用。再次使用Thx;-)您需要如何处理多个事件侦听器?这就是问题所在,什么都没有。。但是,当我在每个控制器中使用带有登录/注销事件侦听器的服务时,每个控制器都会创建新的eventlistener。您可以在不使用事件侦听器的情况下获取用户数据。$getCurrentUser方法将返回当前登录的用户,该用户不需要事件侦听器。
    // Auth factory that encapsulates $firebaseSimpleLogin methods
    // provides easy use of capturing events that were emitted
    // on the $rootScope when users login and out
    .factory('Auth', function($firebaseSimpleLogin, Fb, $rootScope) {
      var simpleLogin = $firebaseSimpleLogin(Fb);
      return {
        getCurrentUser: function() {
          return simpleLogin.$getCurrentUser();
        },
        login: function(provider, user) {
          simpleLogin.$login(provider, {
            email: user.email,
            password: user.password
          });
        },
        logout: function() {
          simpleLogin.$logout();
        },
        onLogin: function(cb) {
          $rootScope.$on('$firebaseSimpleLogin:login',
            function(e, user) {
              cb(e, user);
            });
        },
        onLogout: function(cb) {
          $rootScope.$on('$firebaseSimpleLogin:logout',
            function(e, user) {
              cb(e, user);
            });
        }
      }
    })