2011-06-21 40 views
2

在我的Grails 1.3.7應用程序中,我想使用模板從視圖中分解出周圍的HTML。但是,GSP變量賦值在包含體()中不起作用。我怎樣才能做到以下幾點?如何在Grails模板主體()中分配GSP變量?

_ aTemplate.gsp:

<div class="example"> 
    <% out << body() %> 
</div> 

aView.gsp:

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <meta name="layout" content="main" /> 
</head> 
<body> 
    <g:set var="foo" value="${42}"/> 
    <% assert foo == 42 : foo %> 

    <tmpl:/aTemplate> 
     <g:set var="bar" value="${6}"/> 
     <% assert bar == 6 : bar %> 
    </tmpl:/aTemplate> 
</body> 
</html> 

bar的分配不會工作:bar斷言失敗,當我得到http://localhost:8080/myApp/aView.gsp

org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: 
Error executing tag<g:render>: Assertion failed: 
(bar == 6). Values: bar = null 
at /Users/jbeutel/proj/grailsSandboxes/myApp/grails-app/views/aView.gsp:13 

如何使模板body()正常工作?

另外,有沒有其他方法可以將周圍的HTML分解出來,同時保持它的平衡?我的用例不在頂層,所以我沒有嘗試過使用佈局。如果我使用TagLib閉包而不是模板文件,變量賦值工作正常,但我不想將很多HTML放入閉包,所以我需要將不平衡的HTML放入模板文件中(也就是說,和身體後)。有沒有更好的辦法?

+2

到多遠使用的佈局有你看?在我看來,他們可能會更有利於解決您的問題。我沒有在你描述的情況下使用它們(所以我沒有足夠的信心發佈一個實際的答案),但[''](http://grails.org/doc/最新/ ref/Tags/applyLayout.html)似乎可能會提供一些美味的功能。如果沒有別的,它可能不會遭受你觀察到的同樣的行爲,如果以類似的方式使用(但我再次肯定不知道)。只是一個建議。 –

+0

謝謝!內聯佈局起作用。我將'<%out << body() %>'改爲'',將'view/_aTemplate.gsp'移動到'layouts/aLayout.gsp',並用' '。佈局和正文中的代碼似乎都在工作;我也不需要爲佈局提供參數映射。 –

+0

但是,我遇到了一個問題:佈局只能從控制器獲取模型。除了pageProperty字符串之外,我沒有看到一個方法讓View.gsp傳遞任何東西。 –

回答

1

您可以將.gsp中的變量傳遞給共享模板,然後按如下方式考慮。我這樣做是爲了隱藏我的共同頭中的「登錄」鏈接,如果他們是login.gsp頁面上

<g:render template="/layouts/header" model="['hidelogin':true]"/> 

然後在_header.gsp

<g:if test="${!hidelogin}"> 
    //show your login link 
</g:if>