2016-10-17 4 views
0

J'essaye d'employer la résolution ui-routeur angulaire de météores js pour charger l'information d'un utilisateur choisi de la liste d'utilisateur.Meteor collection dans ui-routeur résoudre

$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; 
      }, 
     } 
    }); 

Le problème est que, pour la première fois après de la liste des utilisateurs, l'affichage du profil utilisateur correctement. Cependant, le rechargement de page rend l'info-utilisateur indéfinie. J'ai invité que de la deuxième fois, le contrôleur chargé déjà de sorte qu'il affiche avant résolu fait ?!

Après un certain temps de recherche, j'ai essayé $ q et délai d'attente $

 resolve: { 
      userinfo: function($stateParams, $q, $timeout) { 
       deferred = $q.defer(); 

       $timeout(function() { 
        deferred.resolve(Meteor.users.findOne({ 
         _id: $stateParams.userId 
        })); 
       }, 1000); 

       return deferred.promise; 
      }, 
     } 

Il fonctionne comme je m'y attendais, le profil de l'utilisateur affiché chaque fois que je rafraîchir la page. Mais si je baisse le délai à 500, il revient à indéfini lorsqu'il est rafraîchi. Je ne sais pas pourquoi dans ce cas, un retard plus long fonctionne?

Merci!

Répondre

0

Voici le code que j'utilise,

résolution: { currentUser: (q $) => {var différé = $ q.defer();

Meteor.autorun(function() { 
    if (!Meteor.loggingIn()) { 
     if (Meteor.user() == null) { 
     deferred.reject('AUTH_REQUIRED'); 
     } else { 
     deferred.resolve(Meteor.user()); 
     } 
    } 
    }); 

    return deferred.promise; 
} 

}

Ceci est d'un tutoriel par @urigo quelque part, ce qui m'a pris un certain temps à trouver, mais cela fonctionne comme un charme.

Ce code est à portée de main pour piéger le cas où l'authentification est nécessaire - mettre au niveau supérieur dans une méthode .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'); 
     } 
    } 
); 
} 
0

Vous pouvez essayer cet itinéraire à résoudre

si vous utilisez angulaire -meteor

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