如何创建一个在 inputText 和 inputSecret 之间切换的复合组件?

2023-12-29

我正在编写一个 Facelets 复合组件,它根据参数在使用 inputText 和 inputSecret 之间切换:

<composite:interface>
    <composite:attribute name="myId" required="true"/>
    <composite:attribute name="secret" required="false" default="false" />
</composite:interface>

<composite:implementation>
    <h:inputSecret rendered="#{cc.attrs.secret}" id="#{cc.attrs.myId}" />
    <h:inputText rendered="#{!cc.attrs.secret}" id="#{cc.attrs.myId}" />
</composite:implementation>

问题是我收到以下错误:

已在视图中找到组件 ID [JSF mangled id]。


使用像 JSTL 这样的视图构建时间标签<c:if> or <c:choose>而不是 JSF 组件的rendered属性。视图构建时标签在构建 JSF 组件树期间进行评估,而呈现的属性仅在基于 JSF 组件树生成 HTML 期间评估(因此您最终仍然会得到both在 JSF 组件树中具有相同 ID 的组件!)。

E.g.

<c:if test="#{not cc.attrs.secret}">
    <h:inputText id="input" />
</c:if>
<c:if test="#{cc.attrs.secret}">
    <h:inputSecret id="input" />
</c:if>

也可以看看:

  • JSF2 Facelets 中的 JSTL...有意义吗? https://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense

无关针对具体问题,myId没有意义。只需给它们一个固定的 ID 即可。如果原因是无法通过 ajax 从外部引用它们,请前往在 f:ajax 渲染中引用复合组件 ID https://stackoverflow.com/questions/13313207/referring-composite-component-id-in-fajax-render/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建一个在 inputText 和 inputSecret 之间切换的复合组件? 的相关文章