Как передать переменную в шаблон grails из файла макета? - PullRequest
14 голосов
/ 02 декабря 2009

Итак, у меня есть шаблон навигации (/common/_navigation.gsp), который отображается в главном файле макетов проектов Grails (/layouts/main.gsp). Как передать некоторую переменную / параметр / аргумент из отдельных файлов представления в макет и, в конечном итоге, в шаблон навигации? Я просто хочу, чтобы правая вкладка выделялась, когда я на странице.

(Мы уже пытались использовать Grails Navigation Plugin. Так как у нас есть разные вкладки, которые указывают на одни и те же контроллеры (один и тот же вид, другой фильтр), он ломается.)

Ответы [ 7 ]

20 голосов
/ 10 декабря 2009

Я делаю эту модель все время. На мой взгляд, я могу прикрепить свойство к странице вручную или с помощью тега параметра в представлении, которое я отображаю. Это не задокументировано в руководстве пользователя Grails, но очень удобно.

<parameter name="foo" value="bar" />

Тогда я получу доступ к свойству страницы с помощью тега pageProperty .

<g:set var="activeNavItem" value="${pageProperty(name: 'page.foo')}"/>

Макет вообще не должен обрабатывать эту переменную: -)

18 голосов
/ 02 января 2012

просто используйте параметр модели например: вид:

<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>
13 голосов
/ 19 июля 2012

Я использую возможно более простой метод. Просто определите переменную в области видимости запроса в отдельном представлении, прежде чем вызывать макет. Он будет доступен во всех шаблонах, использованных в запросе, включая макет и все, вызываемые через <g:render>

<g:set var="SOMEVARIABLE" value="SOMEVALUE" scope="request"/>
<meta name="layout" content="yourlayout">

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

${SOMEVARIABLE}  or <g:if test="${SOMEVARIABLE}">, etc., etc
2 голосов
/ 02 декабря 2009

Вам необходимо использовать свойство страницы: http://grails.org/doc/1.1.1/ref/Tags/pageProperty.html

Затем передайте его в тег рендеринга, используя параметр модели.

ура

Lee

1 голос
/ 16 мая 2016

Шаблон, который мне нравится, использует свойство pageProperty следующим образом. В макете я ссылаюсь на свойство страницы примерно так:

макет gsp

<body id="${pageProperty(name: 'page.pageType')}">
    <g:render template="/layouts/header" />
    <g:layoutBody/>
    <g:render template="/layouts/copyright" />
</div>

... и в разделе <head> конкретной страницы gsp (я обнаружил, что он НЕ работает вне раздела head), я объявляю значение следующим образом:

Страница 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>
0 голосов
/ 30 ноября 2018

Вы можете просто получить доступ к любой переменной в любом шаблоне на странице, получив ее из params. Просто наберите ${params.variable} в макете, и вы получите свою переменную.

0 голосов
/ 12 января 2012

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

...