Tôi cần kích hoạt bản cập nhật ajax khi thay đổi thành hộp văn bản, là thành phần <p:autoComplete>
. Tôi đã quan sát thấy rằng nếu người dùng chọn để nhập văn bản theo cách thủ công, sự kiện sẽ thay đổi, trong khi nếu người dùng nhấp vào một trong các đề xuất cho tự động hoàn thành, sự kiện đó là itemSelect. Vì vậy, tôi đã thêm hai con số <p:ajax>
vào đầu vào, mỗi phương thức gọi cùng một phương thức và có cùng một danh sách cập nhật, nhưng một có event="change"
và số khác event="itemSelect"
.Tự động hoàn thành thủ công: mụcSelect so với thay đổi sự kiện
Tuy nhiên, bây giờ tôi khám phá điều gì đó kỳ quặc. Ví dụ: khi ở chế độ máy chủ thông thường, tôi đã mở trang của mình và nhập "12". Tự động điền được cung cấp "1233" và "1234" làm đề xuất. Tôi nhấp vào "1233" và dường như không có gì xảy ra. Tôi bấm một lần nữa và mọi thứ khác điền vào.
Lặp lại điều này trong trình gỡ lỗi với điểm ngắt trên trình xử lý sự kiện và tôi có thể thấy sau lần nhấp đầu tiên, giá trị là "12" và nhấp chuột thứ hai, nó trở thành "1233".
Bằng cách chuyển đổi nhận xét ra hai khác nhau <p:ajax>
Tôi có thể thấy các hậu quả khác nhau. Nếu không có "thay đổi", trình xử lý không bao giờ được gọi nếu người dùng chọn đề xuất tự động hoàn thành và không có mục "itemSelect", trình xử lý sẽ không bao giờ được gọi nếu người dùng nhập thủ công. Nhưng với cả hai, có hai cuộc gọi và tôi chắc chắn sẽ có khiếu nại về việc nhấp đúp.
Một số mã giả cho những người thích, đầu tiên 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>
Sau đó, Java mã hỗ trợ đậu:
public void idChangeEventListener() {
myBean = myDAO.getDetails(myBean);
// another couple of init-type method calls
}
Khi sử dụng phiên bản PrimeFaces mới hơn, nó phải là 'onstart =" nếu (PF (': widgetVarName'). Panel.is (': visible')) trả về false; "' – mwalter