我们正在为表格视图设置通用标记。
我需要建立标头cols和内容cols。 为了为我想要使用标签主体的内容cols提供灵活的输出。 否则,我使用code属性作为默认输出。
奇怪的事情发生在单元格标签中:
第一次致电
//println body?.call(item:[id:4]) // "item 4"
产生预期结果。 第二个调用(包装在另一个闭包中,暂时存储在页面范围内)
//println body?.call(item:[id:4]) // "item"
没有使用提供的闭包参数。
好像在细胞标签中
println "${body.maximumNumberOfParameters}" // = 1
并在稍后执行:
println "${body.maximumNumberOfParameters}" // = 0
任何人都知道更多关于GroovyPageTagBody的这种情况或内部结构?
提前谢谢。的TagLib:
class PageComponentsTagLib{
def table = { attrs, body ->
Map model = [:]
pageScope._v_cols = []
body()
model << [columns:pageScope._v_cols]
pageScope.variables.remove('_v_cols')
model << [items:attrs.items]
out << render(template:'/tagLib/p/table', model:model)
}
def cell = { attrs, body ->
//println body?.call(item:[id:4]) // "item 4"
//println "${body.maximumNumberOfParameters}" // = 1
pageScope._v_cols << [field:attrs.field, headerLabelCode:attrs.headerLabelCode, content:{ item ->
//println body?.call(item:[id:4]) // "item"
//println "${body.maximumNumberOfParameters}" // = 0
body?.call(item:item)
}]
}
}
模板:
<table>
<thead>
<g:each in="${columns}" var="col">
<th><g:message code="${col.headerLabelCode}"/></th>
</g:each>
</thead>
<tbody>
<g:each in="${items}" var="item">
<tr>
<g:each in="${columns}" var="col">
<td>
<g:set var="_v_b" value="${col.content?.call(item)}"/>
<g:if test="${_v_b}">
${raw(_v_b)}
</g:if>
<g:else>
${item."${col.field}"}
</g:else>
</td>
</g:each>
</tr>
</g:each>
</tbody>
</table>
GSP:
<p:table items="${items}">
<p:cell>
item ${item?.id}
</p:cell>
<p:cell field="actor"/>
<p:cell field="className"/>
</p:table>
Grails版本:2.4.4