ui-router中的流星集合解析

时间:2016-10-17 19:19:22

标签: javascript angularjs meteor angular-ui-router resolve

我尝试使用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。 我不确定为什么在这种情况下,更长的延迟有效?

谢谢!

2 个答案:

答案 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;
                            });
                     }
    }