2012-05-17 18 views
22

Có thể cập nhật thành phần PrimeFaces từ javascript để nó có thể làm mới không?Làm cách nào để kích hoạt làm mới thành phần từ javascript trong các vị trí chính?

Tôi đang thực hiện cuộc gọi lưu ajax bằng cách sử dụng nút này trong hộp thoại. Tôi đã đính kèm javascript tùy chỉnh của mình vào sự kiện chưa hoàn tất.

<p:growl life="1500" id="showmessage"/> 
<p:dialog id="addMemberDialog" widgetVar="addMemberDlg"> 
    <!-- More Code --> 
    <p:commandButton value="Save" 
     actionListener="#{memberManagedBean.save}" 
     oncomplete="handleSaveNewMember(xhr, status, args)" 
     update=":memberListForm:membersTable createupdateform " 
     process="@form" /> 
</p:dialog> 

.. lưu nút lưu, tôi thêm thông báo vào đây để hiển thị cho khách hàng sử dụng thành phần growl.

public void save(ActionEvent event) { 
    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, 
      "Successfuly Add user", "Successfuly Add user"); 
    FacesContext.getCurrentInstance().addMessage(null, message); 

} 

Vấn đề của tôi là, làm cách nào để sắp xếp giao diện người dùng như vậy, tôi nên ẩn hộp thoại trước khi thành phần growl có thể hiển thị meesage?

function handleSaveNewMember(xhr, status, args) { 
    addMemberDlg.hide(); 
    //update the growl after the dialog was hidden? 
} 

Điều đang xảy ra là thành phần gầm gừ được hiển thị cùng với hộp thoại cùng một lúc.

Cảm ơn.

+0

Bạn phải hiển thị hộp thoại khi nhấp vào nút. Bạn đã thử cập nhật gầm gừ từ nút đó thay vì từ nút Lưu trong hộp thoại? – rags

Trả lời

4

bạn luôn có thể làm điều gì đó như thế này (loại bỏ các id ShowMessage từ tiết kiệm nút cập nhật thuộc tính của bạn)

<h:commandButton style="display:none" id="myBtn" > 
    <f:ajax render=":showmessage"/> 
</h:commandButton> 

function handleSaveNewMember(xhr, status, args) { 
    ... 
    jQuery("#myBtn").click(); 
} 

EDIT Nhưng dù sao trong mã hiện tại của bạn, không phải là thoại được đóng cửa ở đồng thời grwol đang được cập nhật?

+0

Bạn có nghĩa là một nút 'giả' là cần thiết cho điều này và điều này không thể được thực hiện thông qua một số api javascript? Nếu đây là trường hợp, tôi đã tự hỏi rằng tôi nên chỉ cần làm theo liên kết này http://forum.primefaces.org/viewtopic.php?f=3&t=18190&view=previous. Vì tất cả mọi thứ được ajaxified sau đó tôi nên kích hoạt các tin nhắn từ phía khách hàng chính nó. Tôi hiểu có đúng không? –

+0

nhưng trong trường hợp bạn muốn gửi tin nhắn từ máy chủ, không phải từ js ... về cách tiếp cận của tôi ... tôi đoán có những cách khác ... nhưng đây là cách tôi kích hoạt "tái render" của phần tử jsf từ js :) – Daniel

+0

oh bạn nói đúng. Tôi đã loại bỏ các showmessage từ danh sách cập nhật vì điều này sẽ tự động hiển thị facesmessage. Hãy để tôi cố gắng giải thích thêm, khi nhấp vào nút lưu, tôi đã xếp hàng đợi khuôn mặt. Kể từ khi autoupdate của growl là sai, tin nhắn sẽ không hiển thị. Đó là mục đích của hàm javascript chưa đầy đủ. Điều gì xảy ra là tôi sẽ ẩn đầu tiên hộp thoại, sau đó tôi muốn tiếng gầm gừ làm mới và hiển thị thông điệp xếp hàng đợi của tôi. Điều này có thể không? –

0

Tại sao bạn không thể đặt p: Hộp thoại bên trong của < h: panelGroup>. như

< h:panelGroup id="addUser" rendered = "boolean value " > 
    < p:dialog id="addMemberDialog" widgetVar="addMemberDlg" > 
     <!-- More Code --> 
     < p:commandButton value="Save" actionListener="#{memberManagedBean.createOrUpdate}" 
       oncomplete="handleSaveNewMember(xhr, status, args)" 
       update=":memberListForm:membersTable createupdateform :showmessage :addUser" 
       process="@form" /> 
    </p:dialog> 
< /h:panelGroup> 

giá trị boolean phải được đặt trong phương thức lưu của bạn. trên thiết lập này là sai trong phương pháp lưu của bạn nó sẽ không hiển thị trong khi cập nhật nó. Vì vậy, thông điệp gầm gừ sẽ hiển thị. Nhưng trước khi gọi phương thức này, giá trị boolean này được đặt là true.

+0

Tôi không thấy cách giải quyết vấn đề cụ thể của OP. – BalusC

44

Bạn có thể sử dụng PrimeFaces '<p:remoteCommand> cho việc này.

<p:remoteCommand name="updateGrowl" update="showmessage" /> 

mà là để được gọi như

<p:commandButton ... oncomplete="addMemberDlg.hide(); updateGrowl();" /> 

Trong trường hợp này đặc biệt có tuy nhiên một cách đơn giản hơn. Đặt thuộc tính autoUpdate của <p:growl> thành true.

<p:growl autoUpdate="true" life="1500" id="showmessage"/> 

Nó sẽ tự động tự cập nhật theo mọi yêu cầu ajax. Nếu thành phần của bạn thực sự không hỗ trợ nó, thì bạn luôn có thể bọc nó trong một <p:outputPanel> cũng hỗ trợ thuộc tính đó.

<p:outputPanel autoUpdate="true"> 
    ... 
</p:outputPanel> 
+0

Chỉ là một FYI nếu người đọc đang sử dụng một phiên bản Jurassic của PF, autlate của growl chỉ có sẵn từ 3.0 trở lên. http://blog.primefaces.org/?p=1164 – Mindwin

2

Lời khuyên của tôi:

  1. Sử dụng <p:remoteCommand> với một thuộc tính actionListener.Thuộc tính này gọi một phương pháp đậu sao lưu có chứa FacesContext.addMessage mã, theo cách này: <p:remoteCommand actionListener="myBean.testMethod()" />
  2. Tiếp theo, trong handleSaveNewMember kịch bản của bạn, gọi thuộc tính remoteCommandname sau addMemberDlg.hide(); theo cách này: <p:remoteCommand name="testScript" actionListener="myBean.testMethod()"/>. Sau đó, function handleSaveNewMember(xhr, status, args) { addMemberDlg.hide(); testScript(); }
  3. Add update thuộc tính để remoteCommand chỉ thành phần tiếng gầm gừ: <p:remoteCommand name="testScript" actionListener="myBean.testMethod()" update="showmessage" />
  4. commandButton của bạn là OK.

Điều này phù hợp với tôi.

Chúc mừng.

0

Bạn có thể sử dụng phần tử PrimeFaces được gọi là p: remotecommand. Phần tử này sẽ thực hiện một hành động (ví dụ để gọi một phương thức bean) và thực thi một cập nhật sau hành động đó.

Có ví dụ trong bài đăng này http://devdublog.blogspot.com/2015/04/best-way-for-calling-method-of.html.

+0

Câu trả lời thường chứa một số ngữ cảnh, không chỉ là một liên kết. Điều này sẽ phù hợp hơn như một bình luận cho câu hỏi. Xem: http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers –

+1

Cảm ơn đề xuất của bạn. Tôi đã chỉnh sửa nhận xét để hoàn thành tính năng này. – Gaalvarez

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