在OmniFaces 1.8.1中測試validateOrder驗證程序時,驗證程序似乎不適用於與Primefaces命令按鈕配合使用,該命令按鈕部分提交基於PrimeFaces選擇器(PFS)。下面是一個示例,這是我的應用程序使用情況的簡明但具有代表性的測試用例。o:在進程屬性中使用PFS時不應用validateOrder
<h:body>
<h:form>
<p:commandButton value="Show" action="#{testBean.save}" oncomplete="PF('testDialogJS').show()"/>
</h:form>
<p:dialog header="Test Dialog" widgetVar="testDialogJS" resizable="false" closeOnEscape="false" closable="false" modal="true" dynamic="true">
<h:form>
<p:tabView>
<p:tab title="Tab 1">
<p:panel header="Tab 1 Panel" styleClass="tab1Panel">
<p:outputLabel value="Test 1"/>
</p:panel>
</p:tab>
<p:tab title="Tab 2">
<p:panel header="Tab 2 Panel" styleClass="tab2Panel">
<h:panelGrid columns="2">
<p:outputLabel for="startDate" value="Start Date: "/>
<h:panelGroup>
<p:calendar id="startDate" value="#{testBean.startDate}" navigator="true" pattern="M/d/yyyy"
required="true" requiredMessage="Start Date is required"/>
<p:message for="startDate"/>
</h:panelGroup>
<p:outputLabel for="endDate" value="End Date: "/>
<h:panelGroup>
<p:calendar id="endDate" value="#{testBean.endDate}" navigator="true" pattern="M/d/yyyy"
required="true" requiredMessage="End Date is required"/>
<p:message for="endDate"/>
<o:validateOrder id="campaignDateRangeValidator" components="startDate endDate" message="Start Date must be before End Date"/>
<p:message for="campaignDateRangeValidator"/>
</h:panelGroup>
</h:panelGrid>
</p:panel>
</p:tab>
</p:tabView>
<p:commandButton value="Save" action="#{testBean.save}"
process="@form" update="@form"
oncomplete="if (!args.validationFailed) { PF('testDialogJS').hide(); }"/>
</h:form>
</p:dialog>
</h:body>
的開始日期,比方說,2014年10月1日和結束日期設定爲2014年9月30日,然後點擊保存按鈕,正確顯示驗證錯誤消息。但是,如果commandButton的進程屬性設置爲@(.tab2Panel :input) @this
,則不會在代碼中調用驗證程序。我在ValidateOrder的validateValues方法中突出了它 - 它從來沒有被調用過。因此,該行爲可以繼續進行。
看着AJAX XHR,javax.faces.partial.execute被設置爲通過的情況下表單的組件ID,而它被設置爲在失敗情況下綁定的單個字段組件ID的顯式列表(沒有表格的組件ID)。
這是一個錯誤?不支持?等等?如果不支持,有關如何處理這種期望的用法的任何建議?謝謝!
Ah k,由於驗證器是非PrimeFaces UI組件,因此PF不一定知道在生成的XHR的執行組件列表中包含驗證器組件?這一切都有道理。並處理選項卡的作品。我現在必須回到真正的應用程序,看看是否有原因,我不是首先處理選項卡。 :) 謝謝! – 2014-09-30 20:28:21
不客氣。不,你的PFS只在具有'tab2Panel'類的HTML元素中選擇所有具有'id'的HTML''元素。 ''不會爲HTML生成任何東西,所以也沒有什麼jQuery可以選擇並將其轉換爲''process'的id。如果您真的想知道PFS的工作方式,請參考以下問答:http://stackoverflow.com/q/20080861除了處理整個選項卡,您還可以明確地將''的'id'添加到'process'屬性。 –
BalusC
2014-09-30 20:32:42
Doh。沒關係。是的,我忘了驗證器不會生成任何客戶端。我知道最終效果和中間的一些部分。大腦與鍵盤上的手指斷開了一會兒。感謝您的鏈接了。 – 2014-09-30 20:37:20