如何在角度流星和离子中反应性地获取当前登录的用户?

时间:2015-09-03 00:35:19

标签: angularjs meteor ionic angular-meteor

我希望$scope.me能够被动地表示当前登录的用户,这样当用户注销并以另一个用户身份重新登录时,此变量就会更新。现在,当用户注销并以另一个用户身份重新登录时,$state.me的旧值仍然存在。重新加载页面后,将更正此值。我该如何解决这个问题?

这是我在控制器中工作的,糟糕的解决方案:

$scope.$on('$ionicView.enter', function(e) {
    if($rootScope.currentUser)
        $scope.me = $rootScope.currentUser;

});

这很有效,但每次用户转换到此状态时都会重置变量......这是一个丑陋的非流星解决方案。

这是我目前的尝试:

$scope.me = ($scope.$meteorCollection(function(){
    return Meteor.users.find({_id: Meteor.userId()});
}))[0];

这应该有效,因为Meteor.userId()是被动的,并且应该强制它的父函数在它发生变化时重新运行,从而实时纠正$scope.me ......但事实并非如此。

相反,$scope.me已更新为旧用户的已清理配置文件...这意味着只有_idprofile可见。这告诉我$scope.$meteorCollection正在重新运行,但旧值为Meteor.userId()

我错过了什么?谢谢!

*编辑* 这是一个转折

$scope.me = ($scope.$meteorCollection(function(){
    console.log("$scope.me reset to "+Meteor.userId());
    return Meteor.users.find({_id: Meteor.userId()});
}))[0];
当用户切换时,

NEW 用户的ID打印到控制台,但即使使用正确的值重新运行查询,仍会返回旧用户。

2 个答案:

答案 0 :(得分:3)

您是否尝试过使用$rootScope.currentUser而不是尝试烘焙自己的解决方案? Angular-Meteor automatically creates this $rootScope object for you,文档说它是被动的。

另一种可能的解决方案是使用$meteor.autorun便捷方法,但不是基于$ scope变量的更改自动运行,而是可以使用if(Meteor.userId())if(Meteor.user())

事实上,如果你look at the source code,这就是Angular-Meteor正在做的事情。

来自docs

// Updated to check for deep equality on the getReactively() call
$meteor.autorun($scope, function() {
     $scope.userForScore = $scope.$meteorObject(Userinfo, 
        {user_id: $scope.getReactively('currentUser', true)._id}
     );// Ultimately searches up scope chain for $rootScope.currentUser._id
});

答案 1 :(得分:0)

我找到了一个解决方案:

$meteor.autorun($scope, function(){
    var user = (Meteor.users.find({_id: Meteor.userId()}).fetch())[0];
    if( user != null ){
        $scope.me = user;
    }
});

$meteor.autorun会自动重新运行函数中包含的反应依赖项。在这种情况下,Meteor.userId()。因此,每当meteor改变它时,函数体重新运行,如果有人登录,则将$scope.me设置为当前用户。

感谢JacobWuzHere提供的建议!