我想更改位于ui:repeat内的InputText的“required”属性,但我无法从ManagedBean访问该组件:
<h:selectManyCheckbox id="required" value="#{test.required}"
layout="lineDirection" converter="javax.faces.Integer">
<f:ajax event="change" listener="#{test.update}" />
<f:selectItems value="#{test.selectable}"></f:selectItems>
</h:selectManyCheckbox>
<ui:repeat value="#{test.names}" var="name" id="repeat">
<h:panelGrid columns="3">
<h:outputLabel id="nameLabel">name:</h:outputLabel>
<h:inputText id="name" value="#{name}"
validator="#{test.validateName}" />
<h:message for="name"></h:message>
</h:panelGrid>
</ui:repeat>
我正在尝试使用findComponent方法,但它不起作用:
public void update(AjaxBehaviorEvent event) {
for(Integer i: selectable) {
UIViewRoot vr = FacesContext.getCurrentInstance().getViewRoot();
HtmlInputText input = (HtmlInputText)vr.findComponent("form:repeat:"+i+":name");
input.setRequired(required.contains(i));
}
}
答案 0 :(得分:1)
ui:repeat
不会重复视图根中的组件,它会在呈现的HTML输出中重复组件的输出。
有几种方法可以正确实现这一目标。其中之一是使用值对象,并在那里设置需求。例如。 List<Item>
其中Item
的属性为String name
和boolean required
。
<ui:repeat value="#{test.items}" var="item" id="repeat">
<h:panelGrid columns="3">
<h:outputLabel id="nameLabel">name:</h:outputLabel>
<h:inputText id="name" value="#{item.name}" required="#{item.required}" validator="#{test.validateName}" />
<h:message for="name"></h:message>
</h:panelGrid>
</ui:repeat>
还有更多方法,但由于您使用的JSF版本和功能要求不清楚,因此只能猜测哪种方式最适用于您的情况。