2010-12-06 3 views
0

ui:repeat内にあるInputTextの「required」プロパティを変更したいのですが、コンポーネントからのアクセスができません。 ManagedBean:ui:repeat内のInputのプロパティを変更します。repeat

<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出力に表示されます。

これを正しく行うにはいくつかの方法があります。そのうちの1つは、値オブジェクトを代わりに使用し、そこで必要性を設定することです。例えば。 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のバージョンと機能要件が不明確であることから、それだけで、あなたのケースで最も適用される方法推測です。

+0

機能要件は、チェックボックスをクリックして項目を選択するときに、対応するinputTextが必要であることです。 – user532357

+0

ローカライズ可能なデータを考えると、チェックボックスはロケールであり、inputTextsは各ロケールのローカライズされたデータです。選択したロケールのinputTextsのみが必要です。たとえば、ある書籍の翻訳されたタイトルを追加したいだけで、その言語を追加するだけで翻訳されているとします。 – user532357

+0

要件は健全です。 'h:selectManyCheckbox'を' h:panelGrid'の第1列の 'h:selectBooleanCheckbox'で置き換えていますか?チェックボックスと入力テキストの両方を同じ繰り返しで行う方が簡単です。 – BalusC