2011-10-05 59 views
1

我想我在使用grails標記解析變量時遇到了一些困難。Grails標記不能解析其體內的變量

在我的標籤庫,我有

def contentArea = {attrs, body ->   
    def domainObject = Class.forName("${attrs.contentType}", true, Thread.currentThread().contextClassLoader).newInstance() 
    def numberOfRows = !StringUtils.equals("${attrs.max}", "null")? new Integer("${attrs.max}") : new Integer("1"); 
    def results = domainObject.getByContentAreaKey("${attrs.contentAreaKey}", numberOfRows) 
    out << g.render(
    template: '/layouts/contentTag', 
    model: [contentAreaKey: attrs.contentAreaKey, results : results, contentNamespace: "${attrs.contentAreaKey}" + "_contentList", body:body()]) 
    out << body() 
} 
在_contentTag.gsp

,佈局:

<b>In tag layout, </b> 
<g:set var="${contentNamespace}" value="bobby"/> 
contentNamespace = ${contentNamespace}<br/><!-- prints "minicontent_contentList" --> 
minicontent_contentList = ${minicontent_contentList}<br/> <!-- prints "bobby" --> 

而在調GSP,標籤被稱爲:

<mynamespace:contentArea var="myVar" contentAreaKey="minicontent" contentType="com.my.test.MiniContentType"> 
    <br/>Test Text<br/> 
    <b>in calling GSP,</b> 
    contentNamespace = ${contentNamespace}<br/><!-- prints nothing --> 
    minicontent_contentList = ${minicontent_contentList}<br/><!-- prints nothing -->   
</mynamespace:contentArea> 

contentNamespace和minicontent_contentList未在標籤的主體中解析。是否可以解決變量?如果是這樣,我該怎麼做?

如果它對答案有幫助,我有一個包含一些小內容區域的頁面,我希望能夠通過不同的控制器進行管理。內容區域背後都有類似的數據(文本,鏈接,圖形等),但佈局會有所不同。我已經使用sitemesh佈局來阻止頁面,並且調用gsp代表這些sitemesh內容塊之一。

我對grails非常陌生,並且希望能夠在SO上尋求幫助,所以我非常樂意接受批評,但請溫柔。 :)

回答

1

body,如在參數中傳遞,是一個Closure,它將它的方法和參數解析到它聲明的位置,這裏將是主要的gsp。您可以嘗試將bodydelegate設置爲標記庫,並將resolveStrategy設置爲Closure.DELEGATE_FIRST。這應該允許您解決contentNamespace

def contentArea = {attrs, body -> 
    ... 
    def contentNamespace = "${attrs.contentAreaKey}" + "_contentList" 
    out << g.render(
    ... 
    body.delegate = this 
    body.resolveStrategy = Closure.DELEGATE_FIRST 
    out << body() 
} 

要解決minicontent_contentlist會更難,因爲我不知道如何指定模板爲代表。您可以嘗試在標記庫中定義變量並將其傳遞給模板模型,然後將minicontent_contentlist值分配給傳遞的對象,該值可以更新標記庫代碼中的值以使resolveStrategy正常工作(假設它爲通過引用傳遞相同的對象。

def contentArea = {attrs, body -> 
    ... 
    def minicontent_contentList 
    out << g.render(..., model:[minicontent_contentList:minicontent_contentList]) 
    ...delegate and resolveStrategy stuff... 
} 

<b>In tag layout, </b> 
<g:set var="minicontent_contentlist" value="bobby"/> 
contentNamespace = ${contentNamespace}<br/><!-- prints "minicontent_contentList" --> 
minicontent_contentList = ${minicontent_contentList}<br/> <!-- prints "bobby" --> 

正如你可以嘗試分配delegate/resolveStrategy模板GSP花括號(${})裏面,看看是否能模板對象分配給delegate參數的最終選擇。

+0

非常感謝您的回答,我一直在嘗試您的第一個建議的一些變體,但我一直無法在調用gsp中獲取contentNamespace。你確實指示我多調查一下代表,所以希望我很快會有一個突破。 – Jaye