Grails не передает переменные во вложенные шаблоны - PullRequest
4 голосов
/ 27 июня 2011

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

Однако, когда я отображаю шаблон из контроллера (как в стиле ajax), только первоначальный шаблон, кажется, имеет доступ к переменным, и вложенные вызовы шаблона не разделяют эту информацию. Пример:

Views & Templates:
a.gsp
_b.gsp
_c.gsp
_one.gsp
_two.gsp
_three.gsp

//PasserController.groovy
class PasserController{
    def v = {
       render(view:"a", model:[time:System.currentTimeMillis()])
    }

    def t = {
        render(template:"one", model:[time:System.currentTimeMillis()])
    }
}    

//a.gsp
A Time is: ${time}<br />
<g:render template="b" />

//_b.gsp
B Time is: ${time}<br />
<g:render template="c" />

//_c.gsp
C Time is: ${time}<br />

//_one.gsp
One Time is: ${time}<br />
<g:render template="two" />

//_two.gsp
Two Time is: ${time}<br />
<g:render template="three" />

//_three.gsp
Three Time is: ${time}<br />

И вывод выглядит следующим образом:

For passer/v
A Time is: 1309188408223
B Time is: 1309188408223
C Time is: 1309188408223

и

For passer/t
One Time is: 1309188515894
Two Time is: 
Three Time is:

Может ли кто-нибудь объяснить мне, почему видимая область видимости переменной в представлении - это все вложенные шаблоны, в том числе вложенные в другие шаблоны, но область видимости в шаблоне, отображаемом непосредственно, - это только этот шаблон, а не вложенные шаблоны?

Если это нарочно (не ошибка), то это немного грустно, потому что требование для этого сайта очень сложное, и теги-метки не очень полезны в этом случае. Кроме того, так как это AJAX, у нас есть много действий, которые должны будут отображать шаблоны вместо представлений, и эти полученные шаблоны могут быть довольно сложными и вложенными в структуру. Есть ли другой способ сделать это?

Спасибо за ваше время и помощь, я понимаю, что это был длинный пост!

1 Ответ

7 голосов
/ 29 июня 2011

Вы можете передать эти аргументы как параметры: <g:render template="two" model="${[time: time]}"/>

...