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

时间:2017-06-21 14:04:54

标签: jsf primefaces composite-component

我对Primefaces(v5.2)有一两个问题:

在复合组件中引用组件

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

myinputfield.xhtml

<composite:interface>
    <composite:attribute name="value" />
    ...
</composite:interface>

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

(当然,真正的应用程序确实有一点&#34;更多。)

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

的index.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>

哪个不行。我尝试了不同的东西,阅读了不同的答案和文章而没有找到答案。

第二个问题完全相反:

复合组件外部引用组件

这一次想象它反过来。我有自定义标签,消息或在我的情况下是工具提示:

mytooltip.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附加到现有组件:

的index.xhtml

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

哪个也行不通。 (当然!?)

我前段时间遇到这个问题并通过在复合组件中包含outputText解决了这个问题。

但我觉得应该可以管理两个用户案例。但是如何?

1 个答案:

答案 0 :(得分:4)

  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可能是更好的方法。