Маршрутизация на домашний экран, когда вы не вошли в систему
Я хочу перенаправить всех пользователей на домашнюю страницу, если они не вошли в систему. В настоящее время я делаю это:
Router.onBeforeAction(function() {
this.render('loading');
if (! Meteor.userId()) {
this.render('Home');
} else {
this.next();
}
});
Который я видел онлайн, но это, кажется, мешает моему 'loading'
шаблон из когда-либо показывал и вместо этого показывает по умолчанию
Loading...
в левом верхнем углу экрана. Если я изменю this.render('Home');
в this.redirect('/')
Я вижу правильный шаблон загрузки. Однако в '/'
маршрут я называю другим this.render('Home')
который я думаю, тогда вызывает onBeforeAction
опять же, который в свою очередь будет перенаправлять на '/'
Это означает, что вы находитесь в бесконечном цикле загрузки.
Итак, как правильно исправить мой Router.onBeforeAction
чтобы достичь желаемой цели, чтобы пользователи, которые не вошли в систему, могли видеть только Home
шаблон независимо от того, какой URL они вводят и делают это, не испортив мой пользовательский шаблон загрузки в другом месте на сайте?
2 ответа
Вам нужно иметь два перед крючками. Один из них предназначен для "загрузки", а второй - для проверки входа пользователя в систему.
"Загрузочный" связан с вашими подписками и обычно представляет собой предустановленный хук с железным маршрутизатором.
Router.onBeforeAction(function() {
if (! Meteor.userId()) {
this.render('Home');
} else {
this.next();
}
}, {except: ['route_one', 'route_two']});
Router.onBeforeAction('loading');
Ваш маршрут:
Router.route('/', {
name: 'home',
subscriptions: function() {
//Array of Meteor.subscribe to wait for and display the loading template
return [Meteor.subscribe("a_subscription")]
},
loadingTemplate: 'loading',
action: function() {
this.render("Home_logged_in");
}
});
Так вот, если Meteor.subscribe("a_subscription")
загружается это будет отображать loading
шаблон. Если пользователь вошел в систему, он будет отображать Home_logged_in
шаблон и если не вошли (на любом маршруте) Home
шаблон.
Вы также можете установить исключения, используя имена "route_one" и "route_two" для своих шаблонов (которые вы можете переименовать во что-нибудь еще). Я назвал ваш домашний шаблон home
, Но если вы добавили home
к except
перечислите, что onBeforeAction не будет применяться к home
,
Я использую это onBeforeAction
Хук, который перенаправляет на домашнюю страницу, если пользователь не вошел в систему:
var userAuthHook = function() {
if (Meteor.userId()) {
//continue to the requested url
this.next();
} else {
//redirect to home
this.redirect('/');
}
};
Router.onBeforeAction(userAuthHook, {
except: ['home']
});
Router.route('/', {
name: 'home'
});
Обратите внимание, что я исключаю домашнюю страницу из ловушки, чтобы избежать циклов перенаправления и что /
Маршрут называется "домом", который будет упоминаться в исключениях хуков.
Это работает для меня, а также позволяет использовать шаблоны загрузки.