如何为数据表列创建复合组件? [英] How to create a composite component for a datatable column?
问题描述
鉴于此数据表(自然有效):
Given this datatable (naturally working):
<rich:dataTable var="var" value="#{values}">
<rich:column>
<f:facet name="header">
HEADER
</f:facet>
<h:outputText value="#{var}" />
</rich:column>
</rich:dataTable>
如果我定义了一个自定义组件(语法也可以,并且在资源/组件下的正确位置):
If I define a custom component (also ok in the syntax and at the right place under resources/components):
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:composite="http://java.sun.com/jsf/composite">
<!-- INTERFACE -->
<composite:interface>
<composite:attribute name="val" />
</composite:interface>
<!-- IMPLEMENTATION -->
<composite:implementation>
<rich:column>
<f:facet name="header">
HEADER
</f:facet>
<h:outputText value="#{cc.attrs.val}" />
</rich:column>
</composite:implementation>
</html>
为什么下面的方法不起作用?
Why does the following does not work?
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition template="/WEB-INF/templates/default.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:my="http://java.sun.com/jsf/composite/components">
<ui:define name="content">
<rich:dataTable var="var" value="#{values}">
<my:mycolumn val="#{var}"/>
</rich:dataTable>
</ui:define>
</ui:composition>
你知道我怎么让它工作(我想定义我自己的列并保存代码)?非常感谢!再见
Do you know how could I let it work (I want to define my own column and save code)? Thanks a lot! Bye
推荐答案
元素必须是 UIColumn
的实例,因为它是 only 在渲染响应阶段 UIData
组件的有效子级.所有其他 UIComponent
类型将被忽略,因此不会呈现.复合组件隐式是 UINamingContaner
组件,它不是 UIColumn
,因此被忽略.
The <my:mycolumn>
element must be an instance of UIColumn
as that's the only valid child of a UIData
component during the render response phase. All other UIComponent
types will be ignored, thus not rendered. A composite component is implicitly a UINamingContaner
component, which isn't a UIColumn
and therefore ignored.
带有扩展 UIColumn
的支持组件的 PrimeFaces
也将无法工作,因为复合组件的生命周期错误.必须在视图构建期间创建列,而在视图渲染期间创建复合组件的主体.
A PrimeFaces <p:dataTable>
with a backing component that extends UIColumn
also won't work due to the wrong lifecycle of a composite component. The column has to be created during the view build time, while the composite component's body is created during view render time.
解决方案是创建一个标签文件,这意味着一个额外的 .taglib.xml
文件,但它可以完美地工作.
The solution is to create a tag file instead, which means an extra .taglib.xml
file, yet it works flawlessly.
/WEB-INF/tags/column.xhtml
:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:rich="http://richfaces.org/rich">
<rich:column>
<f:facet name="header">HEADER</f:facet>
<h:outputText value="#{val}" />
</rich:column>
</ui:composition>
/WEB-INF/my.taglib.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://example.com/my</namespace>
<tag>
<tag-name>column</tag-name>
<source>tags/column.xhtml</source>
<attribute>
<description>Column value</description>
<name>val</name>
</attribute>
</tag>
</facelet-taglib>
注意:<attribute>
条目不是强制性的,但非常适合用于文档目的,例如生成的文档和 IDE 自动完成.
Note: The <attribute>
entries are not mandatory, but are nice for documentation purposes, such as generated docs and IDE autocomplete.
/WEB-INF/web.xml
:
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/my.taglib.xml</param-value>
</context-param>
用法:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:rich="http://richfaces.org/rich"
xmlns:my="http://example.com/my">
<rich:dataTable value="#{values}" var="value">
<my:column val="#{value}" />
</rich:dataTable>
</ui:composition>
这篇关于如何为数据表列创建复合组件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!