引用复合组件内部的组件(反之亦然)
Referencing components inside of composite components (and vice versa)
我在使用 Primefaces (v5.2) 时遇到一两个问题:
引用组件内部复合组件
假设我有一个包装输入字段的复合组件:
myinputfield.xhtml
<composite:interface>
<composite:attribute name="value" />
...
</composite:interface>
<composite:implementation>
<h:inputText value="#{cc.attrs.value}" />
</composite:implementation>
(当然真正的应用程序做的更多"a little"。)
在我的页面中,我现在这样使用这个字段:
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 解决了它。
但我觉得应该可以管理这两种用户案例。但是怎么办?
引用组件内部复合组件
给内部输入一个静态 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" />
引用组件外部复合组件
规范方法是使用完整的客户端 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 可能是更好的方法。
我在使用 Primefaces (v5.2) 时遇到一两个问题:
引用组件内部复合组件
假设我有一个包装输入字段的复合组件:
myinputfield.xhtml
<composite:interface>
<composite:attribute name="value" />
...
</composite:interface>
<composite:implementation>
<h:inputText value="#{cc.attrs.value}" />
</composite:implementation>
(当然真正的应用程序做的更多"a little"。)
在我的页面中,我现在这样使用这个字段:
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 解决了它。
但我觉得应该可以管理这两种用户案例。但是怎么办?
引用组件内部复合组件
给内部输入一个静态 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" />
引用组件外部复合组件
规范方法是使用完整的客户端 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 可能是更好的方法。