2

我正在编写一个 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] 已在视图中找到。

4

2 回答 2

4

使用类似 JSTL 的视图构建时间标记<c:if><c:choose>代替 JSF 组件的rendered属性。视图构建时间标记在构建 JSF 组件树期间评估,而渲染属性仅在基于 JSF 组件树生成 HTML 期间评估(因此您最终仍然会在 JSF 组件树中得到具有相同 ID 的两个组件!) .

例如

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

也可以看看:


与具体问题无关myId,没有意义。给他们一个固定的ID。如果原因是无法通过 ajax 从外部引用它们,请参阅在 f:ajax render 中引用复合组件 ID

于 2012-08-14T20:06:26.190 回答
0

组件是否实际呈现并不重要。这两个组件仍将存在于视图的内部组件树中,并且需要唯一的 id。我们也遇到了这个问题。

我们使用 _1 和 _2 作为 id 后缀,如果我们需要在 javaScript 中获取 id,我们使用 JQuery 的部分匹配器。

在你的情况下,你不能让你的 bean 的 getMyId() 方法根据秘密属性的值返回不同的 id 吗?

于 2012-08-14T19:57:24.743 回答