引用复合组件内部的组件(反之亦然)



我在Primefaces(v5.2)上遇到了一两个问题:

引用复合组件内的组件

假设我有一个包装输入字段的复合组件:

我的输入字段.xhtml

<composite:interface>
<composite:attribute name="value" />
...
</composite:interface>
<composite:implementation>
<h:inputText value="#{cc.attrs.value}" />
</composite:implementation>

(当然,真正的应用程序"有点"多做。

在我的页面中,我现在像这样使用此字段:

索引.xhtml

<my:myinputputfield value=#{controller.inputstring} />

这行得通。但是: 知道我想从外部引用该内部输入字段,例如标签或消息。像这样

<p:inputLabel for="mif" value="Your Input:"/>
<my:myinputputfield id="mif" value=#{controller.inputstring} />
<p:message for="mif" />

当然,这是行不通的,因为id不是为myinputfield定义的。 因此,想到的第一个想法是像这样扩展cc:

myinputfield.xhtml(新增)

<composite:interface>
<composite:attribute name="id" />
<composite:attribute name="value" />
...
</composite:interface>
<composite:implementation>
<h:inputText id="{cc.attrs.id}" value="#{cc.attrs.value}" />
</composite:implementation>

这也行不通。我尝试了不同的东西,阅读了不同的答案和文章,但没有找到答案。


第二个问题完全相反:

引用复合组件外部的组件

这一次,想象一下相反的方式。我有一个自定义的标签、消息,或者在我的情况下是一个工具提示:

我的工具提示.xhtml

<composite:interface>
<composite:attribute name="for" />
<composite:attribute name="value" />
...
</composite:interface>
<composite:implementation>
<p:toolTip for="#{cc.attrs.for}" value="#{cc.attrs.value}" />
</composite:implementation>

这次我想将mytooltip附加到现有组件:

索引.xhtml

<h:outputtext id="ot" value="Hello World!" />
<my:mytooltip for="ot" value="since 1974" />

这也行不通。(当然!?

这个问题我前段时间遇到了,并通过在复合组件中包含输出文本来解决它。


但我感觉应该可以管理这两个用户案例。但是怎么做呢?

  1. 引用复合组件中的组件

    为内部输入提供静态 ID

    <composite:interface>
    <composite:attribute name="value" />
    ...
    </composite:interface>
    <composite:implementation>
    <h:inputText id="input" value="#{cc.attrs.value}" />
    </composite:implementation>
    

    像引用任何命名容器一样引用内部组件:

    <p:inputLabel for="mif:input" value="Your Input:"/>
    <my:myinputputfield id="mif" value=#{controller.inputstring} />
    <p:message for="mif:input" />
    


  1. 引用复合元件外部的元件

    规范方法是使用完整的客户端 ID:

    <h:form id="form">
    <h:outputText id="ot" value="Hello World!" />
    <my:mytooltip for=":form:ot" value="since 1974" />
    </h:form>
    

    但是,由于您要将搜索表达式传递给 PF 组件,因此您还可以:

    <h:form>
    <h:outputText id="ot" value="Hello World!" />
    <my:mytooltip for="@form:ot" value="since 1974" />
    </h:form>
    

    或一般:

    <p:tabView>
    <p:tab title="random tab">
    <h:outputText id="ot" value="Hello World!" />
    <my:mytooltip for="@namingcontainer:ot" value="since 1974" />
    </p:tab>
    </p:tabView>
    

    甚至:

    <h:outputText value="Hello World!" />
    <my:mytooltip for="@composite:@previous" value="since 1974" />
    

    但是,在这种情况下,tag-component/facelet-tag-file可能是更好的方法。

最新更新