Есть ли способ вынести шаблон без макета в 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()