Есть ли способ вынести шаблон без макета в iron-router?

Просто посмотрите код моего контроллера (coffeescript):

class @BasicController extends RouterController
  layoutTemplate: "siteLayout"
  onBeforeAction: (pause)->
    unless Meteor.user()
      @render("loginPage")   #----------------->here
      pause()

В этом случае "loginPage" отображается в yield область siteLayout шаблон. Но мне нужно сделать это без макета. как это реализовать?

4 ответа

Место, чтобы сообщить Iron Router, какой макет использовать (или не использовать), находится в layoutTemplate параметр, а не внутри onBeforeAction функция. Хитрость заключается в том, чтобы сделать layoutTemplate в самоисполняющуюся анонимную функцию:

class @BasicController extends RouteController
  layoutTemplate: (->
      unless Meteor.user()
        return null
      else
        return "siteLayout"
    )()

  onBeforeAction: (pause) ->
    unless Meteor.user()
      @render("loginPage")
      pause()

В этом примере, если пользователь не вошел в layoutTemplate установлен в null и Iron Router рендерится прямо в тело. Иначе, siteLayout используется. Важная часть - это круглые скобки, особенно заключительная () что приводит к оценке функции и возвращению строки или null, а не само определение функции.

Обратите внимание, что вы можете создать альтернативный макет для пользователей, не вошедших в систему, скажем, что у него есть минимальная панель навигации вместо полного меню, и поставить его вместо null на четвертой строке.

Вы можете указать шаблон по умолчанию layoutTemplate для каждого маршрута.

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

Router.route('login',  {
        layoutTemplate: '' //set the layout template to null
    });

Это довольно длинное обсуждение этого вопроса в https://github.com/EventedMind/iron-router/issues/600 и https://github.com/EventedMind/iron-router/issues/607; Я представил патч для этого, и вы можете ожидать, что поведение изменится.

Тем не менее, вы можете использовать this.setLayout контролировать макет перед рендерингом. В Iron Router 0.7.1 вам нужно следующее:

class @BasicController extends RouteController
  layoutTemplate: "siteLayout"
  onBeforeAction: (pause) ->
    unless Meteor.user()
      @setLayout(null)
      @render("loginPage")
      pause()
    @setLayout("siteLayout")

Обратите внимание, что layoutTemplate настройка на самом деле здесь игнорируется, но вы можете вынуть второй setLayout когда запрос на добавление, о котором я упоминал выше, объединяется.

Это на самом деле довольно просто: просто пройти null как твой layoutTemplate параметр:

class @BasicController extends RouterController
  layoutTemplate: null
  onBeforeAction: (pause) ->
    unless Meteor.user()
      @render("loginPage")
      pause()

Другие вопросы по тегам