Javascript 如何关闭工厂方法中的eventlistener,该方法将承诺返回给控制器?
我有一个loginService工厂,用于执行登录、注销并向控制器提供用户数据。因为我需要在每次loginstate更改时更新控制器中的userdata,所以我的factory方法将返回更新承诺: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
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应用程序,它具有类似的功能。我发现处理这件事的方法只是担心三点
$rootScope.$on(“$firebaseSimpleLogin:$login”)
$getCurrentUser()
非常感谢!这对我还不起作用,但你给了我正确的处理方法。现在,我正在努力在
$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);
});
}
}
})