2016-10-10 50 views
5

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.

+0

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? –

+0

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

+0

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. –

cevap

2

Sorun iki katlıdır.

İlk sorun doğrulama başarısız olduğunda <o:validateAll> açıkça context.renderResponse() çağırmaz, ve sırasında aksi en az bir giriş bileşeni <o:validateAll> sonra geçersiz bulunduğunda örtülü doğrulamaları aşamasında arayacak tükendi ya hangi JSF Bu işi bırakır sonraki güncelleme modeli değerleri faz.

İkinci sorun, <rich:tabPanel> sekme anahtarı olayı, invoke uygulama aşaması yerine güncelleme modeli değerleri fazı için kuyruğa alındı. RichFaces'ın neden böyle tasarladığından emin değilim, ancak sonuç yalnızca doğrulama modeli değerleri fazı sırasında doğrulama başarısız olduğunda bile sekme anahtarı olayı tetikleniyor. En az bir ilişkili giriş bileşenden önce <o:validateAll> taşıdığınızda

ardından JSF örtülü zaten ve bu nedenle tamamen validasyonlar aşamasında context.renderResponse() çağrı güncelleme modeli değerleri faz atlamak ve bu nedenle sıraya <rich:tabPanel> sekme anahtarı olay olarak şansı olmayacaktır olacak çağrılan.

OmniFaces 2.6-SNAPSHOT ürününe issue 322 uyarınca düzeltdim. OmniFaces 2.6 veya daha yeni bir sürüm kullanıldığında, <rich:tabPanel> sekme anahtarı olayının istenilen davranışını gerçekleştirmek için <o:validateAll> ağacında yerleştirilmesinin önemi olmayacaktır.

+0

OmniFaces'teki düzeltmeye yönelik ayrıntılı yanıt ve teşekkürler için teşekkürler. –

+0

Bu soruyu sorduğunuz için teşekkür ederiz. – BalusC