我尝试实现一个标记,如果没有作为参数传递,则必须呈现默认主体。这是我的第一次尝试:
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>
在这种情况下使用的最佳方法是什么?
答案 0 :(得分:2)
我打印出&#34; body&#34;在tagLib中找到更多相关内容。
println body.getClass() // outputs: class org.codehaus.groovy.grails.web.pages.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.