2013-08-20 32 views
2

我有一個自定義標籤,因爲我想包裝G:每個自定義標籤g.each衝突,每個封閉

def myEach = { attrs, body -> 
    out << "${g.each(in:attrs.in, var:attrs.var, status:attrs.status) { 'test' }}" 
} 

但因爲它是與每個封閉混淆了每個標籤獲取錯誤。任何方式我可以做到這一點?最糟糕的情況是我會輸出一個包含每個標籤的gsp頁面。

+0

嘗試單引號 –

+0

...圍繞每個。 – dmahapatro

+0

你期待什麼結果? –

回答

1

你完全可以註冊自己的標籤以同樣的方式Grails的作用:

import org.apache.commons.lang.StringUtils; 
import org.codehaus.groovy.grails.web.taglib.GroovySyntaxTag; 
import org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException; 

public class Whatever extends GroovySyntaxTag { 

    public static final String TAG_NAME = "youreach"; 

    public void doStartTag() { 
     String in = attributes.get(ATTRIBUTE_IN); 
     if (StringUtils.isBlank(in)) { 
      throw new GrailsTagException("Tag [" + TAG_NAME + "] missing required attribute [" + ATTRIBUTE_IN + "]", parser.getPageName(), parser.getCurrentOutputLineNumber()); 
     } 

     doEachMethod(in); 
    } 

    public void doEndTag() { 
     endEachMethod(); 
    } 

    public String getName() { 
     return TAG_NAME; 
    } 

    @Override 
    public boolean isKeepPrecedingWhiteSpace() { 
     return true; 
    } 

    @Override 
    public boolean isAllowPrecedingContent() { 
     return true; 
    } 
} 

然後在Bootstrap.groovy,註冊這個班級作爲標籤。

GrailsTagRegistry.instance.registerTag(Whatever.TAG_NAME, Whatever.class) 

您可以創建自己的類,它擴展GroovySyntaxTag操縱任何方法在那裏。然後讓這個類擴展它。

+0

我可以使用我自己的命名空間嗎?而不是克,用另一個? – JavaDev

2

這可能是我想的東西,但單引號沒有幫助,例如:

def myEach = { attrs, body -> 
    out << "${g.'each'(in:attrs.in, var:attrs.var, status:attrs.status) { 'test' }}" 
} 

有了,你會得到同樣的錯誤...

我的解決方案是使用groovyPagesTemplateEngine豆。這樣,您可以解析字符串模板:

def myEach = { attrs, body -> 
    attrs.content = "test" 
    String template = "<g:each in='${attrs.in}'>${attrs.content}</g:each>" 
    groovyPagesTemplateEngine.createTemplate(template, 'mytemplate').make([attrs:attrs]).writeTo(out) 
} 
+0

我會試試這個。如果我想讓內容成爲主體,該怎麼辦?身體可以使用var和status? – JavaDev

+0

設置'attrs.content = body',我認爲它會起作用。 –

+0

我試圖添加參數var。但它在null的內部是空的。 例如 $ {item.name} – JavaDev

1

UPDATE如果你想打電話標,吊牌,只是嘗試調用它,如:

//ApplicationTagLib g 

    def myEach = { attrs, body -> 
    out << g.each([in:attrs.in, var:attrs.var, status:attrs.status]) { 
     'test' 
    } 
    } 

OLD

如果要將字符串放入輸出中,請嘗試使用標準字符串,而不是GroovyString。不"${g.each....}",但'${g.each....}'

out << '${g.each(in:attrs.in, var:attrs.var, status:attrs.status) { \'test\' }}' 

或者只是逃避$

out << "\${g.each(in:attrs.in, var:attrs.var, status:attrs.status) { 'test' }}" 
+0

我認爲第一個會在視圖中打印g.each,而不是解析標籤。 –

+0

當然。據我所知這是JavaDev想要的。或者我錯過了什麼? –

+0

對不起,如果我有點不清楚。我想創建自己的g:每個都需要g:每個行爲。 '測試'只是列表中每個實例呈現的示例內容。 – JavaDev