我有以下代码:
<ui:repeat var = "ctr" value = "#{bean.counterList}">
<h:outputLabel for = "message#{ctr}" value = "#{appMessage['No #{ctr} :" />
<h:inputText id="message#{ctr}" value="#{bean.messageList}" />
</ui:repeat>
counterList
是List<String>
。如果视图中的列表包含1, 2, 3
,那么您应该有3个带有ID的输入字段:message1, message2, message3
。
EL对 id 属性无效,所有组件只接收消息作为ID。另一方面,在标签的值中,EL效果很好。
我可以想象这可能是理想的行为但有解决方法吗?
更新
我删除了id
属性,ui:repeat
负责现在命名id。从源代码中我可以看到生成的ID是唯一的,但现在抛出了这个警告:
INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=fm-story:j_idt103:0:j_idt54[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'.), detail=(Conversion Error setting value '' for 'null Converter'.)]
sourceId=fm-story:j_idt103:1:j_idt54[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'.), detail=(Conversion Error setting value '' for 'null Converter'.)]
答案 0 :(得分:2)
此处描述了您要解决的问题Dynamic Id's in JSF/Seam和此处http://illegalargumentexception.blogspot.com/2009/05/jsf-using-component-ids-in-data-table.html
答案 1 :(得分:2)
我没有检查过,但正确的行为是:
<ui:repeat var = "ctr" value = "#{bean.counterList}">
<h:outputLabel for="message" value="#{appMessage['No #{ctr} :" />
<h:inputText id="message" value="#{bean.messageList}" />
</ui:repeat>
组件标识符 message
不会改变;在生命周期处理期间,client identifier(例如fm-story:j_idt103:0:message
)将逐行更改。标签组件的for
属性算法将能够使用“message”找到输入组件,因为它们共享一个命名容器。
答案 2 :(得分:1)
我遇到同样的问题...... How can i set id of h:panelGroup inside ui:repeat
你不能用ui重复设置id:重复(看看上面的链接)
您可以使用<c:forEach
<c:forEach var = "ctr" items = "#{bean.counterList}">
<h:outputLabel for = "message#{ctr}" value = "#{appMessage['No #{ctr} :" />
<h:inputText id="message#{ctr}" value="#{bean.messageList}" />
</c:forEach>
(但你应该只是JSTL在Facelets中工作的well aware)
答案 3 :(得分:0)
您不应尝试手动索引完整的JSF迭代组件(如<ui:repeat>
,<h:dataTable>
等)内组件的ID。这只会导致你经历过的灾难。它将在JSTL <c:forEach>
内部工作,因为它在构建JSF组件树时作为视图构建时标记运行,而不是在生成HTML输出时。 <c:forEach>
也会生成与迭代一样多的JSF组件。
只需忽略id
属性中的任何EL。 JSF组件将担心自动设置正确的客户端ID。此外,您可以使用varStatus
的{{1}}属性来获取当前循环计数和索引。这样您就不需要2个列表。计数将显示当前轮次。索引是必需的,以便通过索引获取/设置<ui:repeat>
的值。 List<String>
即不起作用,因为<h:inputText value="#{message}" />
类没有设置器。
String
(如果有必要,您可以从上面的代码段中省略<ui:repeat value="#{bean.messageList}" var="message" varStatus="loop">
<h:outputLabel for="message" value="#{appMessage['No']} #{loop.count}:" />
<h:inputText id="message" value="#{bean.messageList[loop.index]}" />
</ui:repeat>
,因为它在任何地方都没有使用过)