2013-09-04 28 views
6

<p:autoComplete> bileşeni olan bir metin kutusuna değişiklik yapıldığında ajax güncelleştirmesi tetiklemem gerekiyor. Kullanıcı metni manuel olarak seçmeyi tercih ederse, olayın bir değişiklik olduğunu, kullanıcının otomatik tamamlama önerilerinden birini tıklatması durumunda olayın itemSelect olduğunu gözlemledim. Bu yüzden girdiye iki tane <p:ajax> çocuk ekledim, her biri aynı yöntemi çağırıyordu ve aynı güncelleme listesine sahipti, ancak biri event="change" ve diğeri event="itemSelect". Bununla birlikte, şimdi tuhaf bir şey keşfettim. Örneğin, normal sunucu modundayken sayfamı açtım ve "12" yazdım. Otomatik tamamlama, öneri olarak "1233" ve "1234" teklif etti. "1233" ü tıklattım ve görünüşte hiçbir şey olmadı. Tekrar tıklattım ve her şey dolduruyor.PrimeFaces otomatik tamamlama: itemSelect'e karşı değişim olayları

Bunu, hata işleyicisinde, olay işleyicisindeki bir kesme noktasıyla tekrarlayın ve ilk tıklamadan sonra, değerin "12" olduğunu ve ikinci tıklamayla olduğunu görüyorum. "1233".

İki farklı <p:ajax> yorumunu değiştirerek farklı sonuçları görebilirsiniz. "Değişiklik" ibaresi olmadan, kullanıcı otomatik tamamlama önerisini seçerse ve hiçbir zaman "itemSelect" olmaksızın, kullanıcı el ile yazılırsa hiçbir zaman işleyici çağrılmazsa, işleyici asla çağrılmaz. Ama her ikisiyle de iki çağrı var ve eminim ki çift tıklama hakkında şikayetler olacak.

gibi olanlar için bazı sözde kod, ilk xhtml:

<p:autoComplete id="itemId" value="#{myBacker.myBean.itemNumber}" 
    required="true" completeMethod="#{myBacker.idAutoComplete}"> 
    <p:ajax event="itemSelect" update="beanDetails" 
     listener="#{myBacker.idChangeEventListener()}" /> 
    <p:ajax event="change" update="beanDetails" 
     listener="#{myBacker.idChangeEventListener()}" /> 
</p:autoComplete> 
<h:panelGroup id="beanDetails"> 
    <h:panelGroup rendered="#{not empty myBacker.myBean.institutionName}"> 
     <h:outputText value="#{myBacker.myBean.institutionName}" /> 
     <!-- Continues with address, phone, etc.. --> 
    </h:panelGroup> 
</h:panelGroup> 

Sonra Java desteğini fasulye kodu:

public void idChangeEventListener() { 
    myBean = myDAO.getDetails(myBean); 
    // another couple of init-type method calls 
} 

cevap

9

ebeveyn Etikete bir widgetVar niteliğini ver, sonra bu küçük eklemek <p:ajax event="change" ...> çocuk etiketine bağlıyor:

onstart="if(widgetVarName.panel.is(':visible')) return false;" 

soru yazıldığında, üzerinde bulunduğumuz Doğru hatırlıyorsam PrimeFaces 3.5 sürümü. değişikliği işaret için mwalter sayesinde ile

onstart="if(PF('widgetVarName').panel.is(':visible')) return false;" 

: O zamandan beri, biz çözüm güncellemeniz gerekir.

+2

Daha yeni PrimeFaces sürümleri kullanıldığında, "onstart =" olması gerekir (if (PF ('widgetVarName'). Panel.is (': görünür')) false değerini döndürür; " – mwalter