我们创建了一个文本输入组件作为JSF 2组件,它封装了标签和编辑字段(h:inputText
),并且还负责布局。
我们目前的问题是让inputField的validator属性暴露在我们的复合组件上。我们在cc:interface部分声明了属性,但在cc:实现中声明内部h:inputText时添加validator="#{validator}"
的问题是,当未使用该字段时,它在运行时失败。
我想以与h:inputText相同的方式执行此操作,而无需注册自定义验证器。
对于这类问题,是否有一些已知的解决方案?我们尝试创建一个在复合组件中使用的自定义标签,但它过于复杂而且最终没有用,所以我想向专家询问是否有一种简单的方法可以做到这一点。
注意:我想在复合组件的validator属性中使用方法绑定表达式,就像h:inputText的原始一样。 谢谢你的帮助!!
答案 0 :(得分:0)
我有一些具有特定掩码,验证和转换器的组件。
首先,我定义了一个名为'defaultText'的组件,如下所示:
</cc:interface>
<cc:attribute name="value"/>
<cc:editableValueHolder name="mycomp" targets="input"/>
</cc:interface>
<cc:implementation>
<p:inputMask id="input" value="#{cc.attrs.value}"/>
</cc:implementation>
(我还有一些其他属性可以节省空间)。看到editableValueHandler?您可以在此定义将链接转换器/验证器的组件。
所以,我用'defaultText'组件来构建其他组件,例如'text.xhtml':
</cc:interface>
<cc:attribute name="value"/>
<cc:attribute name="mask"/>
<cc:attribute name="jsfConverter"/>
<cc:attribute name="jsfValidator"/>
</cc:interface>
<cc:implementation>
<foo:defaultText id="dt" value="#{cc.attrs.value}" mask="#{cc.attrs.mask}">
<c:if test="#{!empty cc.attrs.jsfConverter}">
<f:converter converterId="#{cc.attrs.jsfConverter}" for="mycomp"/>
</c:if>
<c:if test="#{!empty cc.attrs.jsfValidator}">
<f:validator validatorId="#{cc.attrs.jsfValidator}" for="mycomp"/>
</c:if>
</foo:defaultText>
</cc:implementation>
<composite:editableValueHolder>
定义任何验证器/转换器(<f:validator for="mycomp">
)将与<p:inputMask id="input">
相关联。
然后我在我的网页上使用我的文字组件:
<foo:text value="#{dummyMBean.text}" mask="99.999-99" jsfConverter="..." jsfValidator="..."/>