【问题标题】:JSF Composite pass all eventsJSF Composite 传递所有事件
【发布时间】:2017-01-05 03:28:01
【问题描述】:

我想在 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" />

到复合:接口部分,但是我必须为每个事件添加一个客户端行为(将来)。难道没有一种方法可以传递primefaces inputtext继承的所有事件吗?

提前致谢

【问题讨论】:

    标签: jsf events inheritance primefaces composite-component


    【解决方案1】:

    这是不可能的。

    复合材料首先不是这项工作的正确工具。它的主要目的不是干掉和重构重复的 XHTML 代码。它旨在创建一个与单个模型值相关联的全新(输入)组件。例如,&lt;p:fileUpload&gt;&lt;p:imageCropper&gt; 绑定到单个 com.example.Image 属性。或者三个&lt;p:selectOneMenu&gt; 一起绑定到一个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>
    

    另见:

    【讨论】:

    • 感谢您的回答。我将尝试使其与标记文件一起使用。有谁知道是否可以使用这种方法保持 primefaces inputtext 的功能性?我将保留 p:inputtext 的属性而不重新定义它们(如“rendered”、“disbled”……)。
    • 您不需要在 taglib.xml 中显式定义属性。只有 IDE 自动完成功能会受此影响。
    • 我的意思是当我使用您的示例组合代码并希望像这样使用它时: 我不能添加“渲染=false" 属性而不在组合中指定它。有没有办法可以“传递” 已经指定的所有属性?
    • 不,只需使用rendered="#{rendered ne false}"。在复合材料中没有什么不同,只有标记文件不需要&lt;cc:attribute&gt;-like 样板。
    • 是的,但是我必须为我想使用的每个属性都这样做。我希望有一个更简单的方法来继承所有属性。我想我必须重新定义所有属性。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2016-09-22
    • 2012-06-18
    • 2019-12-03
    相关资源
    最近更新 更多