Grails标记中的默认正文行为

时间:2015-04-12 05:23:37

标签: grails

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

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>'
}

然后我们将有两个简单的使用场景。

1)<g:myDiv/>内容正文不存在,应呈现:

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

2)<g:myDiv> SPECIFIC content </g:myDiv>内容正文,应呈现:

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

在这种情况下使用的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我打印出&#34; body&#34;在tagLib中找到更多相关内容。

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

这是GroovyPage.ConstantClosure

当您检查&#39; body&#39;在你的条件下,这是一个关闭。如果使用单个标记<g:tester/>,则主体似乎不存在,并且您可以使用ConstantClosure的asBoolean(),它将返回false。

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

当我使用两个标签<g:tester></g:tester>时,输出为&#34; body&#34;所以我尝试了以下内容:

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.