首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何关闭工厂方法中返回promise给控制器的eventlistener?

如何关闭工厂方法中返回promise给控制器的eventlistener?
EN

Stack Overflow用户
提问于 2014-06-29 03:14:45
回答 1查看 169关注 0票数 1

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

代码语言:javascript
复制
app.controller('TestCtrl', function ($scope, loginService) {
    loginService.currentUserData().then(null, null, function(CurrUserData){
        $scope.CurrUserData = CurrUserData;
    });
});

在loginService中,我监听$firebaseSimpleLogin:登录/注销事件,在它们被激发后,我将userdata对象(由函数根据UID返回)或null ($fbSimpleLogin:logout事件)传递给$emit。最后,在我的loginService.currentUserData()方法中,我监听这个发出的事件并返回deferred.notify(userdata/null)。

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

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

代码语言:javascript
复制
$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;
};
EN

回答 1

Stack Overflow用户

发布于 2014-06-29 08:14:44

我最近写了一个具有类似功能的AngularFire演示应用程序。我发现处理这个问题的方法只需要担心三点。

当用户登录$rootScope.$on('$firebaseSimpleLogin:$login')

  • When时,用户注销$rootScope.$on('$firebaseSimpleLogin:$logout')

  • Calling $getCurrentUser()

时,

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

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

下面是plunker项目和示例工厂:http://plnkr.co/edit/M0UJmm?p=preview

代码语言:javascript
复制
// 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);
        });
    }
  }
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24470082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档