2013-02-22 22 views
5

Tôi có một trang facelet JSF như thế này (phiên bản cực kỳ đơn giản):Primefaces p: thoại không phải lúc nào xuất hiện nếu update = "dlg" trong CommandButton

<h:form id="frmAnagPersonName"> 
     <p:commandButton value="Edit" icon="ui-icon-gear" 
         update="@form :frmEdit" 
         onsuccess="_dlgEdit.show()"/> 
     ... 
     <p:dataTable etc... 
     ... 


    </h:form> 

    <p:dialog id="dlgEdit" widgetVar="_dlgEdit" dynamic="true" modal="true" closable="true" 
       header="Person Identity"> 
     <h:form id="frmEdit" > 
      <p:panelGrid id="pnlEdit" columns="2"> 
       <p:outputLabel id="lblName" for="eName" value="Name"/> 
       <p:inputText id="eName" value="#myBean.personName}" 
      </p:panelGrid> 
     </h:form> 
    </p:dialog> 

Nó hoạt động tốt, cho đến khi tôi đặt một dynamyc header trong hộp thoại:

<p:dialog ... header="#{myBean.header}" ... > 

tại thời điểm đó tôi phải thay đổi update thuộc tính trong p:commandButton:

update="@form :dlgEdit" 

Nhưng trong trường hợp này hộp thoại sẽ chỉ hiển thị ở lần nhấp đầu tiên trên nút. Nó sẽ không hiển thị lần thứ hai, sau đó lại hiển thị ...
Tại sao? Làm cách nào để hộp thoại hiển thị luôn?

Cảm ơn bạn

+0

Phiên bản nào của PF này là gì? thử đặt 'appendToBody =" true "' trên hộp thoại của bạn. Cũng quan sát sự khác biệt trong trạng thái của DOM khi hộp thoại hiển thị Vs khi nó không – kolossus

+0

Cũng lưu ý điều kiện mà hộp thoại xuất hiện: OnSuccess. Điều gì chặn thành công đó? – kolossus

+0

Tôi sử dụng PrimeFaces 3.5. 'appendToBody' không có hiệu lực. Cả hai 'oncomplete' và' onsuccess' đều được gọi (tôi đã thử với JS 'alert()'). Làm thế nào tôi có thể quan sát trạng thái của DOM? (xin lỗi vì sự thiếu hiểu biết của tôi ;-)) – yankee

Trả lời

11

Sử dụng thuộc tính oncomplete thay vì onsuccess thuộc tính.

<p:commandButton ... update="@form :dlgEdit" oncomplete="_dlgEdit.show()" /> 

Các onsuccess thuộc tính được gọi trực tiếp khi phản ứng ajax được đến thành công nhưng rất lâu trước khi các bản cập nhật ajax được thực hiện dựa trên các phản ứng ajax. Thuộc tính oncomplete được gọi khi cập nhật ajax được hoàn tất thành công. Xem thêm the tag documentation of <p:commandButton>.

Về cơ bản, đây là sự kiện đặt hàng gọi:

  • onclick handler được gọi
  • yêu cầu ajax được chuẩn bị với dữ liệu mẫu dựa trên process
  • onbegin handler được gọi
  • yêu cầu ajax được gửi
  • phản hồi ajax được truy xuất thành công (mã trạng thái HTTP là 200)
  • onsuccess handler được gọi
  • cập nhật ajax được thực hiện trong HTML DOM dựa trên update
  • oncomplete handler được gọi
+0

Tôi sẽ chỉ thêm rằng ý kiến ​​của tôi là 'dynamic =" true "' trong ví dụ này không có bất kỳ ý nghĩa nào, vì hộp thoại đã được cập nhật hoàn toàn sau yêu cầu AJAX, vì vậy trong phản hồi AJAX sẽ có toàn bộ hộp thoại và một yêu cầu AJAX khác sẽ được thực hiện để tải hộp thoại động. – partlov

+0

@partlov: Đúng vậy, thuộc tính đó có thể bị bỏ qua. Tuy nhiên, nó hữu ích nếu bạn có nội dung tương đối lớn trong hộp thoại và muốn không tải ngay vào yêu cầu ban đầu, nhưng chỉ khi hộp thoại được mở trong lần đầu tiên. – BalusC

+0

Tôi không biết chính xác Primefaces sẽ hoạt động như thế nào, nhưng nếu hộp thoại động được cập nhật hoàn toàn, nó có thể ở trạng thái "không được tải", vì ban đầu nó được tải.Vì vậy, tải AJAX của hộp thoại sẽ được bắn một lần nữa? Có lẽ tôi sai nhưng tôi không ở trong tình huống để kiểm tra điều này ngay bây giờ. – partlov

Các vấn đề liên quan