2011-10-12 102 views
2

我使用MarkupBuilder的渲染從一個標籤庫,像這樣一些HTML(精簡爲清楚起見):MarkupBuilder的渲染從字符串

def formContainer = new MarkupBuilder(out) 
formConainer.form() { 
    input() { } 
    input() { } 
} 

現在假設表單內的某處()我想在一些拉由用戶指定,以便在文件系統上的文件我有這樣的事情(再次,簡化的)元素...

select() { 
    option() 
    option() 
} 

我的問題是,如果我讀了選擇作爲一個字符串,有沒有讓taglib將其解析爲groovy並將其作爲MarkupBuilder實例的一部分?這樣做的

def formContainer = new MarkupBuilder(out) 
formConainer.form() { 
    input() { } 
    input() { } 

    // I want the select to render here 
} 

回答

1

一個方法是:

String externalMarkup = ''' 
select() { 
    option() 
    option() 
} 
''' 
def out = new StringWriter() 

def formContainer = new groovy.xml.MarkupBuilder(out) 
formContainer.form() { 
    input() 
    input() 

    // Wrap the string in { -> ... } to make it a closure, and evaluate it 
    def extern = new GroovyShell().evaluate("{ it-> ${externalMarkup} }") 
    // Set the delegate of this closure to the MarkupWriter 
    extern.delegate = formContainer 
    // Then execute the closure 
    extern() 
} 
println out.toString() 

然而,這種感覺脆,我...

一個更好的方法可能是使用GroovyTemplateEngine注入你的價值觀進入一個格式化完整的標記位

+0

我喜歡GroovyTemplateEngine方法(我以前使用過)。你知道是否有一種方法可以訪問模板中的Grails標籤庫嗎? – Gregg

+0

嗯......不,來想一想我不: - (不知道你是否可以用這個GSP? –

+0

Bummer。好的,謝謝。 – Gregg