3

我正在尝试创建复合组件。我在节中定义了 4 个属性composite:interface。这是代码

<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" />

奇怪的部分是 required 属性不起作用,但其他部分工作正常。我找不到它为什么会这样。

4

4 回答 4

4

(不是一个真正的答案,但评论太长了。只是想分享一些可能有帮助的想法......请在适当的情况下编辑或替换)

你没有描述你遇到的行为,所以我猜组件内部的值不会随着你传入的值而改变。

我在相同的设置中遇到了类似的问题,但是当我直接传入“true”或“false”时(如您的示例所做的那样),它起作用了。只有当我交出一个 EL 表达式时,组件内部的值才不再设置,而不管表达式的计算结果如何。在我的情况下,我在属性上设置了一个明确的类型,例如type="java.lang.Boolean"删除这个定义就可以了。

我的猜测是,当强制属性期望 boolean 时,它无法处理 EL 并将其解析为 Boolean 的默认值(这似乎是真的,除非default="false"设置)。

通过不设置类型,组件似乎可以保留 EL 并将其传递给下一个目标,例如任何 h:tag 的渲染属性。

似乎不是您的确切问题,但也许有助于追踪问题?

于 2012-09-25T14:59:11.310 回答
0

我也经历过一次组件的奇怪行为。原来是里面的值id有问题

<composite:attribute name="id" />

所以尝试将属性重命名为ident。也许其他通常命名的属性像requiredorvalue也是一个问题......

我遇到的具体,更有趣的情况如下:

<composite:attribute name="id" requred="true" />

工作。注意 中的错字requred。当我修复错字时,组件不再工作,抱怨我没有为 as required 标记id属性指定一个值,尽管我确实为此提供了一个值。解决方案是重命名复合属性:

<composite:attribute name="ident" required="true" />
于 2013-07-07T08:43:49.703 回答
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>
于 2013-09-25T10:39:00.870 回答
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}"/>

这是黑客,但工作)

于 2013-06-20T08:29:46.487 回答