我希望$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
已更新为旧用户的已清理配置文件...这意味着只有_id
和profile
可见。这告诉我$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打印到控制台,但即使使用正确的值重新运行查询,仍会返回旧用户。
答案 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提供的建议!