我尝试了以下代码:
<ui:repeat var="item" id="request" value="#{myBean.requestList}">
<h:selectBooleanCheckBox id="#{item.name}" value="#{item.type}"/>
<h:outputText value="#{item.name}"/>
</ui:repeat>
我也试过
<ui:repeat var="item" id="request" value="#{myBean.requestList}">
<ui:param name="dynamicVal" value="#{item.name}"/>
<h:selectBooleanCheckBox id="#{dynamicValue}" value="#{item.type}"/>
<h:outputText value="#{item.name}"/>
</ui:repeat>
这两个都有错误:
java.lang.IllegalArgumentException: component identifier must not be a xero-length String at javax.faces.component.UIComponentBase.isIdValid ..
这段代码有什么不对?如何将动态ID分配给标签&amp; id是一样的。我需要这个用于自动机。
答案 0 :(得分:4)
在视图构建期间评估id
属性,但<ui:repeat>
在视图渲染时运行。从本质上讲,您的ID最终为null
,这确实无效。
只是不要尝试手动分配生成ID。 <ui:repeat>
已经自动在客户端ID中插入当前迭代索引。这个例子,
<h:form id="formId">
<ui:repeat ...>
<h:outputLabel for="checkboxId" ... />
<h:selectBooleanCheckBox id="checkboxId" ... />
</ui:repeat>
</h:form>
最终会像
一样<form id="formId">
<label for="formId:0:checkboxId">...</label>
<input type="checkbox" id="formId:0:checkboxId" />
<label for="formId:1:checkboxId">...</label>
<input type="checkbox" id="formId:1:checkboxId" />
<label for="formId:2:checkboxId">...</label>
<input type="checkbox" id="formId:2:checkboxId" />
...
</form>
如果你绝对肯定你需要手动摆弄这样的ID,那么请改用<c:forEach>
。它在视图构建期间运行,生成物理上多个JSF组件。您可以在<c:forEach var>
属性中使用varStatus
和id
。
顺便问一下,您是否考虑过<h:selectManyCheckbox>
?