Как передать переменную в шаблон 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

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