2012-01-10 77 views
7

我有一個數據表。表中的每一行都有一個commandButton,稱爲'刪除',它應該從模型和視圖中刪除該行並就地執行更新。作爲頁腳,我還有另一個commandButton,名爲'刪除每行'成功的Ajax調用後Datatable不會更新

最後一個按鈕的作品。我點擊它,每行都從模型中刪除(即包含元素的ArrayList變爲空),並且dataTablefooter facet在視圖中被重新渲染(或更新)。

另一方面,當我單擊其中一行上的按鈕時,將其刪除,它會部分工作。相應的元素將從模型中刪除,但視圖不會更新。該行仍然存在於dataTablefooter facet未更改。我的users.xhtml中有以下一段代碼。

<f:metadata> 
    <f:viewParam name="id" value="#{users.id}" /> 
    <f:event type="preRenderView" listener="#{users.init}" /> 
</f:metadata> 

... 

<h:form id="usersForm"> 
    <p:outputPanel>  
     <p:dataTable id="userTable" value="#{users.user.friendList}" var="friend"> 
      <p:column> 
       <h:outputText value="#{friend.name}" /> 
      </p:column> 
      <p:column> 
       <p:commandButton action="#{users.user.removeFriend(friend)}" 
        ajax="true" 
        update="userTable somethingElse" process="@this" 
        onerror="errorDialog.show();" 
        icon="ui-icon-delete" 
        title="delete user"> 
       </p:commandButton> 
      </p:column> 

      <f:facet id="somethingElse" name="footer"> 
        aye: ${users.user.xxx} 
      </f:facet> 
     </p:dataTable> 

    </p:outputPanel> 

    <p:commandButton action="#{users.user.removeAllFriends()}" ajax="true" 
       update="userTable somethingElse" 
       process="@this" 
       icon="ui-icon-close" 
       value="delete all friends?"> 
    </p:commandButton> 


</h:form> 

那麼,你認爲這裏的問題是什麼?

我3.0

+0

不要在一個問題中提出多個問題。每個問題的一個問題,請:)我已經編輯了另一個問題。此外,關聯的前一個問題根本就沒有關係。也許是相同的代碼,但問題是絕對不一樣的。至於你目前的問題:你使用的是哪個PF版本?如果你使用'update =「@ form」'而不是? – BalusC 2012-01-10 12:51:50

+0

對不起,但非常感謝你,再次:)關於多個問題,我會盡力在下次:) – 2012-01-10 13:12:42

+0

我轉發它爲答案:) – BalusC 2012-01-10 13:15:44

回答

11

我認識到這個問題的形式我們當前的PF 3.0頁面。如果您使用update="@form",它將起作用。我沒有真正的時間來調查真正的原因,以便我可以向PF夥伴報告,因爲這個問題並沒有在所有頁面中顯示。即使在同一張桌子上,不同的按鈕也可以按照默認的方式工作。

試試看:

<p:commandButton update="@form" ... /> 

更新:來想想,它可能涉及到的process="@this"存在。

+0

我更喜歡你的答案,因爲它更加高效和乾淨。我想知道此修補程序是否也適用於在Primefaces 2.2.1上運行的應用程序?我將不得不對此進行測試,並瞭解何時我有更多時間。 – 2012-01-10 13:24:43

+0

我有一個PF 3.2中的現有項目,這仍然是一個問題。有誰知道它是否已在更高版本中修復? – Catfish 2012-10-15 19:57:05

+0

@Catfish:這已經在PF 3.4中得到確認和修復:http://stackoverflow.com/questions/12516397/how-to-ajax-update-the-pdatatable-from-inside-the-pdatatable-itself/12517181# 12517181 – BalusC 2012-10-15 20:03:51

1

您可能正在使用Primefaces 2.2.1,因爲這似乎是由於與Primefaces dataTable組件一個共同的錯誤使用JSF 2.0和Primefaces。本質上發生的是,從dataTable的元素中發生的ajax回發不會導致dataTable中元素的部分頁面更新。

最簡單的解決方法是從dataTable之外的按鈕調用回發,其唯一目的僅僅是部分頁面更新dataTable。這不是最有效的解決方案,因爲它會導致兩次回發,但它確實有效。

見我以前回答這個問題Here

+0

我實際上使用Primefaces 3.0。它也有這個bug嗎? – 2012-01-10 13:11:14

+0

這是我的印象,這是固定在3.0但是我還沒有使用3.0,已經遇到了這個呢。 – 2012-01-10 13:23:35

+0

好的,謝謝你的回答! – 2012-01-10 13:30:50

1

如果要使用服務器ID更新組件(如userTable,somethingElse,...),這些組件必須與觸發更新的組件(例如,您的按鈕)位於同一個命名容器中。否則,您需要在update屬性中使用像這樣的表達式:update=":usersForm:userTable"

主要問題是確定命名容器。外部按鈕可以工作,因爲它與ID爲userTable的表位於同一個命名容器(表單)中。由於整個表得到更新,方面得到更新,但由於datatable本身就是一個命名容器,它應該可以通過在外部按鈕上使用update="somethingElse"來更新頁腳而不是

我不確定,爲什麼內部按鈕不起作用。我想在數據表中還有另一個命名容器。如果使用UIComponent實現的findComponent算法無法找到組件,PrimeFaces會記錄INFO。 INFO: Cannot find component with identifier "userTable" in view.

0

這是解決在JSF 2.0

<p:dataTable id="empl1" var="emp" value="#{dtEmployeeView.employee}" selectionMode="multiple" rowKey="#{emp.id}" 
           paginator="true" rows="5" tableStyleClass="ui-table-columntoggle"> 
    <p:column width="20" headerText="Id" priority="1"> 
     <h:link value="#{emp.id}" /> 
    </p:column> 
    <p:column headerText="Employee Name" priority="2"> 
     <h:outputText value="#{emp.pname}" /> 
    </p:column> 

</p:dataTable> 
<p:commandButton update="form1:empl1" ajax="true" value="Submit" action="#{empService.addEmployee(employee)}" > 
    <f:event type="preRenderView" listener="#{dtEmployeeView.init()}"/> 
</p:commandButton> 
0

我有過濾器在我的數據表進行刷新。所以我在這裏解決了這個問題

oncomplete="PF('myWidgetVar').filter()" and update="@form"