Bir dizi girdi bileşenini doğrulamak için OmniFaces' <o:validateAll> doğrulama aracını kullanıyorum. Bu, RichFaces <rich:tabPanel> içine koymadığım sürece iyi çalışır. Bunu yaptığımda ve alanları boş bıraktığımda, doğrulama başarısız olur (beklendiği gibi), ancak başarısız olan doğrulamadan bağımsız olarak etkin sekme değiştirilir. Denediğim diğer doğrulayıcılar, doğrulama başarısız olduğunda, tabPanel
'un başka bir sekmeye geçiş yapmasını engeller.Neden <o: validateAll> diğer doğrulayıcılardan farklı davranıyor?
Bunun nedeni ne olabilir?
Şu anda OmniFaces 2.1 ve RichFaces 4.5.17.Final Mojarra 2.2.12 on Wildfly 9.0.2 kullanıyorum. <f:validateDoubleRange>
tarafından tetiklenen
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:o="http://omnifaces.org/ui"
xmlns:rich="http://richfaces.org/rich">
<h:form id="form">
<rich:messages />
<rich:tabPanel id="tabPanel">
<rich:tab id="tab1" header="Tab 1">
<h:inputText id="myDouble" value="#{someDoubleVal}">
<f:validateDoubleRange minimum="1.0" maximum="2.0"/>
</h:inputText>
<o:validateAll id="allValid" components="myDouble" message="Missing value!" />
</rich:tab>
<rich:tab id="tab2" header="Tab 2">
Just another tab to switch.
</rich:tab>
</rich:tabPanel>
</h:form>
</ui:composition>
1.0 ve 2.0 dışında bir değer girin ve beklenen davranış görmek için Tab 2 geçmeyi deneyin,: Burada
sorunu yeniden oluşturmaya XHTML kodu olan yüzler-mesaj görüntülenir ve ilk sekme hala aktif.Girdiyi boş bırakın ve <o:validateAll>
davranışını görmek için Sekme 2'ye geçmeyi deneyin: doğrulama başarısız gibi görünüyor (bir yüz mesajı görüntülenir), ancak Sekme 2 etkinleştirildi.
Güncelleme: açıklanan davranış switchType="ajax"
(varsayılan) yanı sıra switchType="server"
ile birlikte geçerlidir. Her iki durumda da, sekme paneli, dahil edilen girişlerin bir gönderimini gerçekleştirir, böylece bir kullanıcı bakış açısından, bir sekme anahtarı, <h:commandButton>
gönderme ile aynı gibi görünür (teknik olarak farklılıklar olabilir, bilmiyorum Sekme panelinin uygulama detayları. Bir <f:setPropertyActionListener>
ile düzenli <h:commandButton>
ile sekme geçişi gerçekleştirmek ise
, <o:validateAll>
yani sekme anahtar doğrulama hatası nedeniyle gerçekleştirilmez diğer doğrulayıcıları aynı şekilde, hareket eder.
<rich:tabPanel id="tabPanel" activeItem="#{bb.activeTab}">
...
<rich:tab id="tab1" name="tab1" header="Tab 1">
...
<h:commandButton value="submit">
<f:setPropertyActionListener value="tab2" target="#{bb.activeTab}" />
</h:commandButton>
...
</rich:tab>
</rich:tabPanel>
Not: Bu problemli davranış gösteren bir minimalistik örnektir. Gerçek kodumda, sadece <o:validateAll>
tarafından onaylanmış tek bir bileşenim yok ve aslında giriş değerlerini destekleyici ile ilişkilendiriyorum. Gözlenen davranış tamamen aynıdır.
Fark ettim ki, XHTML kodundaki ' 'etiketinin konumunu değiştirmek davranışını değiştiriyor! Gerçekten doğrulanması gereken bileşenlerden önce koyun ve beklendiği gibi çalışır. OmniFaces'de bu istenen davranış mı yoksa bir hata mı? Belgeler bu etkiden bahsetmiyor. Herhangi bir fikir? –
Ne kadar zengin olduğundan emin olun: tabPanel, kapakların altında çalışır, ancak sipariş davranışı, http://omnifaces.org/docs/javadoc/2.5/org/omnifaces/component/validator/ValidateMultipleFields'ın ilk "genel kullanım" paragrafında belgelenmiştir. html – BalusC
Doğru, sipariş davranışı belgelendi. Ama aynı zamanda "Bu doğrulayıcı formun herhangi bir yerine yerleştirilebilir, ancak bileşenlerin formda göründüğü gibi sırayla doğrulanacağını unutmayın" diyor. Bununla birlikte, bu durum doğrulama işleminin çevreleyen sekme panelinin farklı davranışlarını neden tetiklediğini açıklığa kavuşturmaz. Ama belki de burada garip olan RichFaces bileşenidir. Ben izlenim altındayım, RichFaces zaten böyle gariplikler var. Belki de örneği PrimeFaces ile deneyeceğim ve bunun nasıl çalıştığını göreceğim. –