2013-09-04 5 views
6

Po zmianie w polu tekstowym, które jest komponentem <p:autoComplete>, muszę wywołać aktualizację ajaxową. Zauważyłem, że jeśli użytkownik zdecyduje się ręcznie wpisać tekst, zdarzenie jest zmianą, natomiast jeśli użytkownik kliknie jedną z propozycji autouzupełniania, zdarzenie to itemSelect. Więc dodałem dwa dzieci <p:ajax> do wejścia, z których każdy wywołuje tę samą metodę i ma tę samą listę aktualizacji, ale ma jedną event="change" i drugą event="itemSelect".Autouzupełnianie PrimeFaces: itemWybierz w porównaniu do zdarzeń zmian

Jednak teraz odkrywam coś dziwnego. Na przykład podczas normalnego trybu serwera otworzyłem stronę i wpisałem "12". Autouzupełnianie oferowało "1233" i "1234" jako sugestie. Kliknąłem "1233" i wydawało się, że nic się nie stało. Kliknąłem ponownie i wszystko inne wypełniłem.

Powtórz to w debugerze z punktem przerwania w procedurze obsługi zdarzeń i widzę, że po pierwszym kliknięciu wartość wynosi "12", a po drugim kliknięciu staje się "1233".

Po przełączeniu komentowania dwóch różnych <p:ajax> widzę różne konsekwencje. Bez "zmiany" jeden program obsługi nigdy nie jest wywoływany, jeśli użytkownik wybierze propozycję autouzupełniania, a bez elementu "itemSelect", program obsługi nigdy nie zostanie wywołany, jeśli użytkownik wpisze ręcznie. Ale w przypadku obu z nich są dwa połączenia i jestem pewny, że będą dwa zażalenia dotyczące podwójnego kliknięcia.

Niektóre pseudo-kod dla tych, którzy lubią, najpierw 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> 

Następnie kopii Java Kod Fasola:

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

Odpowiedz

9

Daj tag nadrzędny atrybut widgetVar, a następnie dodać ten mały atrybut do znacznika <p:ajax event="change" ...> dziecko:

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

Gdy pytanie zostało napisane, byliśmy na PrimeFaces wersja 3.5, jeśli dobrze pamiętam. Od tego czasu musimy zaktualizować rozwiązanie do:

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

z podziękowaniem dla mwaltera za wskazanie zmiany.

+2

Podczas korzystania z nowszych wersji PrimeFaces powinno to być 'onstart =", jeśli (PF ("widgetVarName"). Panel.is (": visible") zwraca false; "' – mwalter

Powiązane problemy