2010-12-06 51 views
0

我想更改位于ui:repeat内的InputText的“required”属性,但我无法访问来自ManagedBean:在ui中更改输入的属性:重复

<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)); 
    } 
} 

回答

1

ui:repeat不重复的成分在视图根,它重复组件的输出在呈现的HTML输出中。

有几种方法可以正确实现此目的。其中之一是使用一个值对象,并在那里设置需求。例如。 a List<Item>其中Item具有属性String nameboolean 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版本和功能需求不明确,这只是猜测哪种方式,你的情况是最适用的。

+0

功能要求是,当您选择一个项目点击复选框时,必须要求相应的inputText。 – user532357 2010-12-06 15:21:03