我正在尝试创建复合组件。我在composite:interface
部分中定义了4个属性。这是代码
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface >
<composite:attribute name="id" />
<composite:attribute name="maxlength" />
<composite:attribute name="required"/>
<composite:attribute name="value" />
</composite:interface>
<composite:implementation xmlns:kc="http://java.sun.com/jsf/composite/components/kaysComposite">
<p:inputTextArea id="#{cc.attrs.id}" value="#{cc.attrs.value}" maxlength="#{cc.attrs.maxlength}" required="#{cc.attrs.required}" counterTemplate="{0} / #{cc.attrs.maxlength}" counter="#{cc.attrs.id}_counter"/>
<h:outputText id="#{cc.attrs.id}_counter"/>
</composite:implementation>
</html>
这是我使用我的组件的页面
<kc:kaysInputTextArea id="gpAdres" value="#{someBean.variable}" maxlength="250" required="true"/>
<p:message for="gpAdres" />
奇怪的部分是必需的属性不起作用,但其他人工作正常。我无法找到它为什么会这样。
答案 0 :(得分:4)
(不是一个真正的答案,但评论的时间太长。只是想分享一些可能有帮助的想法......如果合适,请编辑或替换)
您没有描述您遇到的行为,因此我猜测组件内的值不会随您传入的值而改变。
我在相同的设置中遇到了类似的问题,但是当我直接传入“true”或“false”时(如您的示例所示),它可以正常工作。只有当我移交EL表达式时,无论表达式的计算结果如何,组件内的值都不会再设置。在我的例子中,我在属性上设置了显式类型,例如type="java.lang.Boolean"
删除此定义就可以了。
我的猜测是,当强制该属性期望布尔值时,它无法处理EL并将其解析为默认值Boolean(除非设置了default="false"
,否则它似乎为真)。
通过不设置类型,组件似乎可以保留EL并将其传递给下一个目标,例如任何h:tag的渲染属性。
似乎不是您的确切问题,但也许它有助于追踪问题?
答案 1 :(得分:0)
您可以使用此方法。
<kc:kaysInputTextArea id="gpAdres" value="#{someBean.variable}" maxlength="250" required="true" rendered="#{yourBooleanExpression}"/>
<kc:kaysInputTextArea id="gpAdres" value="#{someBean.variable}" maxlength="250" required="false" rendered="#{!yourBooleanExpression}"/>
这是黑客,但工作)
答案 2 :(得分:0)
我也经历过一次奇怪的组件行为。事实证明,
中的值 id 存在问题<composite:attribute name="id" />
因此,尝试将属性重命名为 ident 。也许其他常见名称属性如required
或value
也是一个问题...
具体,更有趣的情况是:
<composite:attribute name="id" requred="true" />
的工作。注意requred
中的拼写错误。当我修复拼写错误时,组件不再起作用,抱怨我没有为必需的标记id
属性指定值,尽管我确实提供了一个值。解决方案是重命名复合属性:
<composite:attribute name="ident" required="true" />
答案 3 :(得分:0)
尝试使用另一个属性:id是为复合标记保留的,所以你应该尝试这个:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface >
<composite:attribute name="inputTextId" />
<composite:attribute name="maxlength" />
<composite:attribute name="required"/>
<composite:attribute name="value" />
</composite:interface>
<composite:implementation xmlns:kc="http://java.sun.com/jsf/composite/components/kaysComposite">
<p:inputTextArea id="#{cc.attrs.inputTextId}" value="#{cc.attrs.value}" maxlength="#{cc.attrs.maxlength}" required="#{cc.attrs.required}" counterTemplate="{0} / #{cc.attrs.maxlength}" counter="#{cc.attrs.id}_counter"/>
<h:outputText id="#{cc.attrs.inputTextId}_counter"/>
</composite:implementation>
</html>