JSF Composite 传递所有事件
JSF Composite pass all events
我想在 JSF(带有 primefaces)中创建我的自定义复合组件,它在输入前面显示一个标签并在末尾添加一条消息。
为此,这是我的源代码:
合成:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface componentType="customInput">
<composite:attribute name="label" />
<composite:attribute name="value" />
</composite:interface>
<composite:implementation>
<h:panelGrid columns="3">
<h:outputText value="#{cc.attrs.label}:" />
<p:inputText id="abcde" value="#{cc.attrs.value}" />
<p:message for="abcde" />
</h:panelGrid>
</composite:implementation>
</html>
支持 bean:
@FacesComponent(value = "customInput")
public class CustomInput extends InputText implements NamingContainer {
@Override
public String getFamily() {
return UINamingContainer.COMPONENT_FAMILY;
}
}
到目前为止,还不错。现在我想使用 p:inputText 组件继承的事件。例如:
<pch2:PchInputText2 label="Name" id="test2" value="#{testBean.test}">
<p:ajax event="blur" listener="#{chantierFormBean.updateMap()}" />
<p:ajax event="change" listener="#{chantierFormBean.updateMap()}" />
</pch2:PchInputText2>
我知道我可以通过添加
来传递这些事件
<composite:clientBehavior name="change" event="change" targets="abcde" />
到 composite:interface 部分,但我必须为每个事件(将来)添加一个客户端行为。难道没有一种方法可以传递 primefaces inputtext 继承的所有事件吗?
提前致谢
这不可能。
复合材料首先不是这项工作的正确工具。它的主要目的并不是干掉和重构重复的 XHTML 代码。它旨在创建一个绑定到单个模型值的全新(输入)组件。例如,<p:fileUpload>
和 <p:imageCropper>
一起绑定到单个 com.example.Image
属性。或者三个 <p:selectOneMenu>
一起绑定到一个 java.time.LocalDate
属性。
改用标记文件。
<ui:composition ...>
<h:outputLabel for="#{id}" value="#{label}:" />
<p:inputText id="#{id}" value="#{value}">
<ui:insert />
</p:inputText>
<p:message for="#{id}" />
</ui:composition>
另请参阅:
- How to make a grid of JSF composite component?
- When to use <ui:include>, tag files, composite components and/or custom components?
我想在 JSF(带有 primefaces)中创建我的自定义复合组件,它在输入前面显示一个标签并在末尾添加一条消息。
为此,这是我的源代码:
合成:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface componentType="customInput">
<composite:attribute name="label" />
<composite:attribute name="value" />
</composite:interface>
<composite:implementation>
<h:panelGrid columns="3">
<h:outputText value="#{cc.attrs.label}:" />
<p:inputText id="abcde" value="#{cc.attrs.value}" />
<p:message for="abcde" />
</h:panelGrid>
</composite:implementation>
</html>
支持 bean:
@FacesComponent(value = "customInput")
public class CustomInput extends InputText implements NamingContainer {
@Override
public String getFamily() {
return UINamingContainer.COMPONENT_FAMILY;
}
}
到目前为止,还不错。现在我想使用 p:inputText 组件继承的事件。例如:
<pch2:PchInputText2 label="Name" id="test2" value="#{testBean.test}">
<p:ajax event="blur" listener="#{chantierFormBean.updateMap()}" />
<p:ajax event="change" listener="#{chantierFormBean.updateMap()}" />
</pch2:PchInputText2>
我知道我可以通过添加
来传递这些事件<composite:clientBehavior name="change" event="change" targets="abcde" />
到 composite:interface 部分,但我必须为每个事件(将来)添加一个客户端行为。难道没有一种方法可以传递 primefaces inputtext 继承的所有事件吗?
提前致谢
这不可能。
复合材料首先不是这项工作的正确工具。它的主要目的并不是干掉和重构重复的 XHTML 代码。它旨在创建一个绑定到单个模型值的全新(输入)组件。例如,<p:fileUpload>
和 <p:imageCropper>
一起绑定到单个 com.example.Image
属性。或者三个 <p:selectOneMenu>
一起绑定到一个 java.time.LocalDate
属性。
改用标记文件。
<ui:composition ...>
<h:outputLabel for="#{id}" value="#{label}:" />
<p:inputText id="#{id}" value="#{value}">
<ui:insert />
</p:inputText>
<p:message for="#{id}" />
</ui:composition>
另请参阅:
- How to make a grid of JSF composite component?
- When to use <ui:include>, tag files, composite components and/or custom components?