我尝试使用meteor angular js ui-router解析加载从用户列表中选择的一个用户的信息。
$stateProvider
.state('userprofile', {
url: '/user/:userId',
cache: false,
template: '<user-profile userinfo="$resolve.userinfo"></user-profile>',
controller: UserProfile,
controllerAs: name,
resolve: {
userinfo: function($stateParams) {
viewedUser = Meteor.users.findOne({
_id: $stateParams.userId
});
return viewedUser;
},
}
});
问题是,从用户列表中第一次正确显示用户配置文件。但是,页面重新加载会使userinfo变为未定义。 我是客人,第二次,控制器已加载,以便在解析完成之前显示?!
经过一段时间的搜索,我尝试了$ q和$ timeout
resolve: {
userinfo: function($stateParams, $q, $timeout) {
deferred = $q.defer();
$timeout(function() {
deferred.resolve(Meteor.users.findOne({
_id: $stateParams.userId
}));
}, 1000);
return deferred.promise;
},
}
它按预期工作,每次刷新页面时都会显示用户配置文件。 但是如果我将延迟降低到500,则在刷新时返回到undefined。 我不确定为什么在这种情况下,更长的延迟有效?
谢谢!
答案 0 :(得分:0)
这是我使用的代码,
解决:{ currentUser:($ q)=&gt; { var deferred = $ q.defer();
Meteor.autorun(function () {
if (!Meteor.loggingIn()) {
if (Meteor.user() == null) {
deferred.reject('AUTH_REQUIRED');
} else {
deferred.resolve(Meteor.user());
}
}
});
return deferred.promise;
}
}
这是来自@urigo某个地方的教程,花了我一些时间才找到,但它就像一个魅力。
此代码可以方便地捕获需要身份验证的情况 - 将其放在.run方法的顶层
function run($rootScope, $state) {
'ngInject';
$rootScope.$on('$stateChangeError',
(event, toState, toParams, fromState, fromParams, error) => {
console.log("$stateChangeError: "+error);
if (error === 'AUTH_REQUIRED') {
$state.go('login');
}
}
);
}
答案 1 :(得分:0)
您可以在解决方案中尝试此路线
如果你使用角度流星
resolve: {
'loginRequired': function ($meteor, $state) {
return $meteor.requireUser().then(function (user) {
if (user._id) {return true;}
}).catch(function () {
$state.go('login');
return false;
});
}
}