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
}
Podczas korzystania z nowszych wersji PrimeFaces powinno to być 'onstart =", jeśli (PF ("widgetVarName"). Panel.is (": visible") zwraca false; "' – mwalter