Grails 不会将变量传递给嵌套模板

Posted

技术标签:

【中文标题】Grails 不会将变量传递给嵌套模板【英文标题】:Grails does not pass variables to nested templates 【发布时间】:2011-09-23 15:07:03 【问题描述】:

当我从控制器渲染视图时,传递给视图的变量在视图中渲染的所有模板的范围内,包括嵌套多层深度的模板。

但是,当我从控制器(如 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:

谁能向我解释为什么视图上的明显变量范围是所有子模板,包括嵌套在其他模板中的子模板,但直接呈现的模板上的范围只是该模板而不是嵌套模板?

如果这是故意的(不是错误),这有点可悲,因为此站点的要求非常复杂,并且在这种情况下,taglibs 并不是一个真正有用的选项。此外,由于这是 ajax,我们有许多操作需要渲染模板而不是视图,并且这些生成的模板可能非常复杂并且嵌套在结构中。有没有其他方法可以做到这一点?

感谢您的时间和帮助,我知道这是一篇很长的帖子!

【问题讨论】:

@Quad64bBit:对不起,我还是不明白为什么你不能使用视图?如果您担心 ajax 响应(可能被解释为带有视图的 HTTP 响应),您可以手动渲染。 但是为什么不把这个参数作为参数传递呢? &lt;g:render template="two" model="$[time: time]"/&gt; 感谢您的反馈,但我无法控制我们是否为此使用 ajax。将要传递的变量不是一个简单的字符串,它是对象的集合,据我所知,我不能在 标记中传递它。我是否误解了 ajax 如何换出页面的一部分?我可以用视图和模板替换 div 的内容吗? @splix 啊,是的!你其实是对的。请提交您的评论作为答案,以便我投票!我没有意识到我可以像使用控制器中的 render() 那样在 【参考方案1】:

您可以将此参数作为参数传递:&lt;g:render template="two" model="$[time: time]"/&gt;

【讨论】:

谢谢!我没有意识到您可以使用 gsp 标签传递复杂的集合,就像使用 groovy 方法/闭包一样。谢谢!

以上是关于Grails 不会将变量传递给嵌套模板的主要内容,如果未能解决你的问题,请参考以下文章

将 Javascript 变量传递到 createlink 方法调用 Grails

在 grails 服务中使用 g.render

Grails 2.x createCriteria 'or' 不适用于嵌套关联

GRAILS --- 如何在 g:link 中传递字符串文字到控制器方法

Grails 控制器变量在视图中不可见

如何将部分模板加载到grails中的div中