Как передать переменную в шаблон grails из файла Layout?
Итак, у меня есть шаблон навигации (/common/_navigation.gsp), который отображается в главном файле макета проекта Grails (/layouts/main.gsp). Как передать какую-либо переменную/параметр/arg из отдельных файлов просмотра в макет и, в конечном итоге, в шаблон навигации? Я просто хочу, чтобы правая вкладка была выделена, когда я нахожусь на странице.
(Мы уже пробовали использовать навигационный плагин Grails. Поскольку у нас есть разные вкладки, указывающие на одни и те же контроллеры (одинаковый вид, другой фильтр), он разбивается.)
Ответы
Ответ 1
Я делаю эту схему все время. На мой взгляд, я могу привязать свойство к странице либо вручную, либо с помощью тега параметра в представлении, которое я просматриваю. Его не документировано в руководстве пользователя Grails, но его супер удобно.
<parameter name="foo" value="bar" />
Затем я бы получил доступ к свойству страницы, используя pageProperty tag.
<g:set var="activeNavItem" value="${pageProperty(name: 'page.foo')}"/>
Макет не должен обрабатывать эту переменную: -)
Ответ 2
просто используйте параметр модели
например:
вид:
<g:render template="../path/template" model="[header:'test', headers:['a','b'], values:[['a':1,'b':2],['a':3,'b':4]] ]"/>
_template:
<br/>
<h3>${header}</h3>
<table>
<thead>
<tr>
<g:each in ="${headers}" var="he">
<th>${he}</th>
</g:each>
</tr>
</thead>
<tbody>
<g:each in ="${values}" var="v">
<tr>
<g:each in ="${headers}" var="h">
<td>${v[h]}</td>
</g:each>
</tr>
</g:each>
</tbody>
</table>
Ответ 3
Я использую, возможно, более простой метод. Просто определите переменную в области запроса в отдельном представлении, прежде чем вы назовете ваш макет. Он будет доступен во всех шаблонах, используемых в запросе, включая макет и любые вызовы через <g:render>
<g:set var="SOMEVARIABLE" value="SOMEVALUE" scope="request"/>
<meta name="layout" content="yourlayout">
Затем просто привяжите переменную так же, как и любой другой в своем макете или другие шаблоны, втянутые вашим представлением
${SOMEVARIABLE} or <g:if test="${SOMEVARIABLE}">, etc., etc
Ответ 4
Вам нужно использовать свойство страницы: http://grails.org/doc/1.1.1/ref/Tags/pageProperty.html
Затем передайте его в тег рендеринга, используя параметр модели.
веселит
Ли
Ответ 5
Образец, который мне нравится, использует pageProperty следующим образом. В макете я ссылаюсь на pageProperty следующим образом:
Макет gsp
<body id="${pageProperty(name: 'page.pageType')}">
<g:render template="/layouts/header" />
<g:layoutBody/>
<g:render template="/layouts/copyright" />
</div>
... и в разделе <head>
конкретной страницы gsp (я обнаружил, что он НЕ работал за пределами главы), я объявляю значение следующим образом:
Страница gsp
<head>
<meta name="layout" content="main"/>
<parameter name="pageType" value="homePg" />
</head>
Результат HTML
<body id="homePg">
... header, body and footer ...
</body>
Кроме того, я могу ввести значение из модели контроллера в pageProperty следующим образом:
контроллер
def index() {
model: [modelPageType: 'adminPg']
}
Макет gsp (с использованием того же макета, что и выше)
<body id="${pageProperty(name: 'page.pageType')}">
<g:render template="/layouts/header" />
<g:layoutBody/>
<g:render template="/layouts/copyright" />
</div>
Страница gsp
<head>
<meta name="layout" content="main"/>
<parameter name="pageType" value="${modelPageType}" />
</head>
Результат HTML
<body id="adminPg">
... header, body and footer ...
</body>
Ответ 6
Вы можете просто получить любую переменную в любом шаблоне на странице, получив ее из параметров. Просто введите ${params.variable}
в макете, и вы получите свою переменную.
Ответ 7
Основываясь на моих чтениях, я считаю, что не очень хорошая практика передавать переменные в ваш макет. Переменные модели доступны в вашем представлении. Я думаю, что макеты должны использоваться только для указания структуры страницы, в то время как представления могут использоваться для заполнения содержимого.