【问题标题】:MarkupBuilder Rendering From StringMarkupBuilder 从字符串渲染
【发布时间】:2011-10-12 04:55:56
【问题描述】:

我正在使用 MarkupBuilder 从 taglib 中呈现一些 HTML,如下所示(为了清晰起见,将其删除):

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

现在假设在 form() 中的某个地方我想提取用户指定的一些元素,因此在文件系统上的文件中我有类似这样的内容(再次,简化)...

select() {
  option()
  option()
}

我的问题是,如果我将 select in 作为字符串读取,是否有办法让 taglib 将其解析为 groovy 并使其成为 MarkupBuilder 实例的一部分?

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

   // I want the select to render here
}

【问题讨论】:

    标签: grails groovy markupbuilder


    【解决方案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 将您的值注入格式化的完整标记位

    【讨论】:

    • 我喜欢 GroovyTemplateEngine 方法(我以前用过这个)。你知道是否有办法访问模板中的 Grails 标签库吗?
    • Hmmmm....不,想想我没有 :-( 我想知道你是否可以为此使用 GSP?
    • 好吧,不用过多介绍,这必须是最终用户可以放入我们的系统并正确渲染的东西。有点像 CMS,但没有那么花哨。
    • weceem app 里面可能值得一看案例);-)
    • 谢谢。我会检查一下。与此同时,我和 {% %} 相处得很好。糟糕,但让我感动。
    猜你喜欢
    • 2021-01-30
    • 2017-03-21
    • 1970-01-01
    • 2018-02-06
    • 2018-08-30
    • 2019-11-26
    • 1970-01-01
    • 2012-08-20
    • 2019-07-19
    相关资源
    最近更新 更多