ui-router resolve中的流星集合

Meteor collection in ui-router resolve

本文关键字:流星 集合 resolve ui-router      更新时间:2023-09-26

我试图使用meteor angular js ui-router resolve来加载从用户列表中选择的一个用户的信息。

$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。我不知道为什么在这种情况下,更长的延迟工作?

谢谢!

这是我使用的代码,

解决:{currentUser: ($q) => {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');
      }
    }
  );
}

您可以在resolve

中尝试此路由。

如果你使用角流星

resolve: { 
     'loginRequired': function ($meteor, $state) {
                        return $meteor.requireUser().then(function (user) {
                                if (user._id) {return true;}
                            }).catch(function () {
                                $state.go('login');
                                return false;
                            });
                     }
    }