Grails TagLib从嵌套标签调用存储体

时间:2014-12-02 09:17:14

标签: grails taglib

我们正在为表格视图设置通用标记。

我需要建立标头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

0 个答案:

没有答案