В моем приложении есть несколько макетов для разных нужд, и я хочу выбирать его динамически. Например, в зависимости от параметров GET или если пользователь вошел в систему.
Как я могу это сделать?
В моем приложении есть несколько макетов для разных нужд, и я хочу выбирать его динамически. Например, в зависимости от параметров GET или если пользователь вошел в систему.
Как я могу это сделать?
На самом деле вы можете динамически изменять layoutTemplate, используя this.router.layout()
из хука перед (и, возможно, других хуков). Это немного скрыто и, вероятно, изменится, но вот как я смог изменить layoutTemplate в зависимости от того, вошел ли пользователь в систему или нет:
Router.configure({
layoutTemplate: "defaultLayout",
before: function (pause) {
if(!Meteor.user()) {
// render the login template but keep the url in the browser the same
this.router.layout("loginLayout");
this.render('login');
// pause the rest of the before hooks and the action function
pause();
}else{
//Here we have to change the layoutTemplate back to the default
this.router.layout("defaultLayout");
}
}
});
Это может стать немного сложным, если у вас есть несколько layoutTemplates, так как после того, как маршрут больше не будет приостановлен, он сохранит новый layoutTemplate, который вы установили, если вы не измените его снова.
pause()
на this.next()
, поэтому этот код не будет работать без модификации: stackoverflow.com/questions/26629835/
- person James M. Lay; 22.02.2015
EDIT Поскольку автор отредактировал вопрос здесь, а также спецификации iron:router
со временем изменились, я решил немного обновить этот ответ, чтобы избежать путаницы.
Документацию по использованию пакета iron:router
можно найти здесь.
Есть несколько возможных ответов на вопрос в зависимости от типа «параметров».
Обычно основным источником знаний будет path
, потому что пользователь не обязательно ожидает, что макет страницы изменится, если path
останется прежним. В этом случае все довольно просто, потому что вам нужно только определить соответствующие маршруты:
Router.route('/some/path/', {
layoutTemplate: 'myFirstLayoutTemplate'
});
Router.route('/another/path/', {
layoutTemplate: 'mySecondLayoutTemplate'
});
Если вам когда-нибудь понадобится более точный контроль, вы всегда можете выбрать макет вручную в хуке action
, назначенном маршруту give:
Router.route('/some/path', {
/* ... */
action: function () {
if (Meteor.user()) { // check if user is logged in
this.layout('loggedInUserLayout');
} else {
this.layout('someDefaultLayout');
}
// you need this because otherwise the router
// will not render your templates
this.render();
}
});
Обратите внимание, что хук action
запускается в рамках вычислений, и поскольку Meteor.user()
является реактивным источником данных ваша страница будет перерисовываться каждый раз, когда пользователь входит/выходит из системы.
Более подробную информацию о макетах можно найти здесь а>.
this
, это также работает: Router.current().layout('loggedInUserLayout')
. Полезно, например, для тех, кто использует стрелочные функции.
- person Bart S; 25.05.2021
В настоящее время Meteor не имеет возможности динамически отображать шаблоны на сервере перед их отправкой клиенту. Вместо этого он обслуживает весь комплект вместе.
Таким образом, внутри этого пакета вы создаете шаблоны и используете их в зависимости от действий пользователя, URL-адресов, параметров сеанса и т. д.
Взгляните на Iron Router, который поможет вам в работе.
Кроме того, в настоящее время ведется обсуждение в группе метеора-разговора Google. и элемент на дорожной карте метеора на доске Trello.
Я просто оставлю это здесь, это с 2019 года и работает после некоторых трудностей...
Router.route('/', function () {
Router.current().layout("applicationLayoutEmpty");
this.render('landing', {to: 'content'});
if(Meteor.userId()){
Router.go("/social");
}
});
Магия заключается в следующем: Router.current().layout("applicationLayoutEmpty");
При настройке IronRouter он использует набор по умолчанию в main.js, но его можно использовать даже в окне браузера — попробуйте!
template
(используя{{#if cond}} ... {{else}} ... {{/if}}
и сообщив условие, используяdata
, доступный в iron-router). Есть ли какая-либо причина, кроме сохранения шаблонов полностью лишенными логики, что вы не принимаете этот подход? - person musically_ut   schedule 26.02.2014layoutTemplate
в настоящее время не Работа. Я пробовал несколько вариантов условного назначения шаблона в хукеbefore
как вRouter.configure
, так и в конкретном маршруте. Ни один из этих экспериментов не сработал. - person David Weldon   schedule 27.02.2014