2016-10-17 5 views
0

Я пытаюсь использовать разрешение метеоритов js ui-router для загрузки информации одного пользователя, выбранного из списка пользователей.Ошибка сбора метеоров в решении 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 и $ таймаут

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

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

       return deferred.promise; 
      }, 
     } 

Он работает, как я ожидал, профиль отображается каждый раз, когда я обновите страницу. Но если я опускаю задержку до 500, она возвращается к неопределенной при обновлении. Я не уверен, почему в этом случае работает более длинная задержка?

Спасибо!

ответ

0

Вот код, который я использую,

решительность: { CurrentUser: ($ д) => { вар отложила = $ 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'); 
     } 
    } 
); 
} 
0

Вы можете попробовать это маршруты в решимостью

если вы используете угловые -meteor

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