【问题标题】:Default body behaviour in a Grails tagGrails 标签中的默认主体行为
【发布时间】:2015-06-17 15:18:13
【问题描述】:

我正在尝试实现一个标签,如果没有作为参数传递,则该标签必须呈现默认正文。这是我的第一次尝试:

def myDiv = { attrs, body ->
  out << '<div class="fancy">'
  if (body) //this approach doesn't work cause body is a closure that is never null
     out << body()
  else
     out << 'default content'
  out << '</div>'
}

那么我们将有 2 个简单的使用场景。

1) &lt;g:myDiv/&gt; 内容主体不存在,应呈现:

<div class="fancy">
   default content
</div>

2) &lt;g:myDiv&gt; SPECIFIC content &lt;/g:myDiv&gt; 内容体存在,应该呈现:

<div class="fancy">
   SPECIFIC content
</div>

在这种情况下最好的方法是什么?

【问题讨论】:

  • 执行 body() 并将输出分配给一个变量,看看输出是空还是 null 呈现默认正文?
  • 是的。我测试了您的解决方案,它似乎有效。这不是我能想到的最干净的,我担心它隐藏了一些陷阱。还是谢谢。
  • 我怀疑你还有其他选择

标签: grails


【解决方案1】:

我打印了tagLib中的“body”类来了解更多。

println body.getClass() // outputs: class org.codehaus.groovy.grails.web.pages.GroovyPage$ConstantClosure

这是GroovyPage.ConstantClosure

当您检查您的状态中的“body”时,它是一个闭包。如果你使用单个标签&lt;g:tester/&gt;,body 似乎不存在,你可以使用 ConstantClosure 的 asBoolean(),它会返回 false。

def tester = {attrs, body ->
  println body.asBoolean()  // prints: false
  if (body) {
    println "body"
  } else {
    prinltn "no body"
  }
}
// outputs : "no body"

当我使用两个标签 &lt;g:tester&gt;&lt;/g:tester&gt; 时,输出是“body”所以我尝试了以下操作:

def tester = {attrs, body ->
  println "**$body**"      // prints:  **
                           //          **
  println body.asBoolean() // prints:  true
  println body().size()    // prints:  1
}

我猜正文包含一些返回字符或空格。

我最好的解决方案是调用 body() 方法,这将返回一个字符串,您可以在其上调用 trim() 并在符合常规的条件下检查它

def tester = {attrs, body ->
  if (body().trim()) {
    println "body"
  } else {
    println "no body"
  }
}  // outputs : "no body" in all scenarios except when body contains something relevant.

【讨论】:

  • 其实我很欣赏body().asBoolean() 解决方案。还调用&lt;g:tester&gt;&lt;/g:tester&gt; 是一种很好的方式来告诉“我不希望愚蠢的默认内容作为我的标签正文”
  • 一种更好的方法可能是只检查 .gsp 文件中是否存在参数,如果需要修改参数,则在必要时在 taglib 中进行,例如:`
    (taglib stuff or $argument)Default content
    ".
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
相关资源
最近更新 更多