2013-05-27 80 views
1

是否可以在<ui:repeat><h:dataTable>內使用OmniFaces <o:validateAllOrNone>(這很酷;))?OmniFaces o:validateAllOrNone in ui:repeat or h:dataTable

我需要一個表,每行有一個輸入欄。你可以填寫任何這些值或全部。

如果我把<o:validateAllOrNone><ui:repeat><h:dataTable>內,並使用輸入字段的id在components屬性,那麼驗證器也被觸發,如果所有字段爲空。

回答

0

不,這是不可能的。 components屬性必須在物理上指代多個組件,而不是多次呈現的單個組件。但是,它可以用於物理上在同一輪迭代中呈現的多個組件。 <o:validateXxx>多字段驗證程序不用於引用多次呈現的單個組件。唯一的OmniFaces驗證程序是<o:validateUniqueColumn>

如果您想在基於集合的動態輸入上使用<o:validateXxx>多字段驗證程序,那麼最好的方法是使用JSTL <c:forEach>。它將在物理上構建多個組件。

E.g.

<c:forEach items="#{bean.items}" var="item" varStatus="loop"> 
    <h:inputText id="input_#{loop.index}" value="#{item.value}" /> 
</c:forEach> 

假設有3個項目,這將動態地創建JSF組件與input_0input_1input_2的ID。然後,你可以只使用<o:validateXxx>如下(把它的循環外!)

<o:validateAllOrNone components="input_0 input_1 input_2" /> 

可以通過EL表達式從背襯返回組件ID的所需空間分隔的字符串替換在上述例子中的硬編碼的串豆。

<o:validateAllOrNone components="#{bean.inputIds}" /> 

另一種方法是自己創建一個<x:validateAllOrNoneColumn>或張貼在OmniFaces問題跟蹤改進請求。改變現有的<o:validateAllOrNone>並不是完全微不足道的,即需要完全獨立的組件。

+0

啊好吧,感謝迄今,所以我認爲最好的方法是使用此C:foreach方法... – J4y