Как изменить layoutTemplate в зависимости от какого-то выражения? Железо-роутер

В моем приложении есть несколько макетов для разных нужд, и я хочу выбирать его динамически. Например, в зависимости от параметров GET или если пользователь вошел в систему.

Как я могу это сделать?


person Vitalii Del Vorobioff    schedule 26.02.2014    source источник
comment
Лично я бы переместил этот бит логики в template (используя {{#if cond}} ... {{else}} ... {{/if}} и сообщив условие, используя data, доступный в iron-router). Есть ли какая-либо причина, кроме сохранения шаблонов полностью лишенными логики, что вы не принимаете этот подход?   -  person musically_ut    schedule 26.02.2014
comment
Вы уже используете Iron Router или любой другой пакет маршрутизаторов?   -  person Serkan Durusoy    schedule 26.02.2014
comment
Основываясь на этой проблеме, похоже, что динамическая настройка layoutTemplate в настоящее время не Работа. Я пробовал несколько вариантов условного назначения шаблона в хуке before как в Router.configure, так и в конкретном маршруте. Ни один из этих экспериментов не сработал.   -  person David Weldon    schedule 27.02.2014


Ответы (4)


На самом деле вы можете динамически изменять 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, который вы установили, если вы не измените его снова.

person Dsyko    schedule 18.04.2014
comment
Просто примечание для покровителей; недавно железо: маршрутизатор заменил 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() является реактивным источником данных ваша страница будет перерисовываться каждый раз, когда пользователь входит/выходит из системы.

Более подробную информацию о макетах можно найти здесь.

person Tomasz Lenarcik    schedule 26.02.2014
comment
Благодарю вас! Для тех, кто хочет избежать использования this, это также работает: Router.current().layout('loggedInUserLayout'). Полезно, например, для тех, кто использует стрелочные функции. - person Bart S; 25.05.2021

В настоящее время Meteor не имеет возможности динамически отображать шаблоны на сервере перед их отправкой клиенту. Вместо этого он обслуживает весь комплект вместе.

Таким образом, внутри этого пакета вы создаете шаблоны и используете их в зависимости от действий пользователя, URL-адресов, параметров сеанса и т. д.

Взгляните на Iron Router, который поможет вам в работе.

Кроме того, в настоящее время ведется обсуждение в группе метеора-разговора Google. и элемент на дорожной карте метеора на доске Trello.

person Serkan Durusoy    schedule 26.02.2014

Я просто оставлю это здесь, это с 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, но его можно использовать даже в окне браузера — попробуйте!

person Andy    schedule 02.03.2019