2013-09-04 103 views
6

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 
} 

Trả lời

9

Đưa thẻ mẹ một thuộc tính widgetVar, sau đó thêm chút này thuộc tính cho thẻ con <p:ajax event="change" ...>:

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

Khi câu hỏi được viết, chúng tôi đã bật PrimeFaces phiên bản 3.5, nếu tôi nhớ chính xác. Kể từ đó, chúng tôi cần cập nhật giải pháp cho:

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

nhờ cảm ơn mwalter đã chỉ ra thay đổi.

+2

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