2012-01-10 10 views
7

私はデータテーブルを持っています。テーブルの各行にと呼ばれるcommandButtonがあります。は、その行をモデルとビューから削除し、インプレースで更新を実行することになっています。フッタとして、と呼ばれる別のcommandButtonがあります。「すべての行を削除してください」データテーブルが正常にajax呼び出し後に更新されません

最後のボタンが機能します。クリックすると、すべての行がモデルから削除されます(つまり、要素を含むArrayListが空になります)、dataTablefooter facetがビューで再レンダリング(または更新)されます。

一方、いずれかの行のボタンをクリックすると、それを削除するために部分的に機能します。対応する要素はモデルから削除されますが、ビューは更新されません。その行はまだdataTableにあり、footer 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> 

ここで問題は何だと思いますか?それはPrimefacesのdataTableコンポーネントと共通のバグが原因であるように、これは思えるようおそらくPrimefaces 2.2.1を使用している3.0

+0

1つの質問で複数の質問をしないでください。質問ごとに1つの質問:私は他の質問を編集しました。またリンク先の質問は全く関連していません。それはおそらく同じコードですが、問題は全く同じではありません。あなたの現在の問題については、どのPFバージョンを使用していますか?代わりに 'update =" @ form "'を使用するとどうなりますか? – BalusC

+0

悪い言葉を残して申し訳ありませんが、もう一度感謝します:)複数の質問について、私は次回に最善を尽くすように努力します:) –

+0

私は答えとして再投稿しました: – BalusC

答えて

11

を参照してください。代わりにupdate="@form"を使用すると動作します。本当の原因を調べる時間がありませんでしたので、この問題はすべてのページでは表示されないため、PFのメンバーに報告することができます。同じテーブルであっても、別のボタンがインテントとして機能します。更新

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

はそれを試してみることについて考えて来て、それはprocess="@this"の存在に多分関連です。

+0

私はより効率的できれいなので、あなたの答えが気に入っています。この修正がPrimeface 2.2.1上で動作するアプリケーションでも動作するのだろうか?私はこれを試して、時間があるときを見つけなければなりません。 –

+0

PF 3.2に既存のプロジェクトがありますが、これはまだ問題です。それは、それ以降のバージョンで修正されている場合誰も知っていますか? – Catfish

+0

@キャットフィッシュ:これはPF3.4で承認され、修正されました:http://stackoverflow.com/questions/12516397/how-to-ajax-update-the-pdatatable-from-inside-the-pdatatable-itself/12517181# 12517181 – BalusC

1

私はJSF 2.0とPrimefacesを使用しています。基本的に何が起こるかは、dataTableの要素内から発生するajaxポストバックが、dataTableの要素の部分的なページ更新をもたらさないことです。

最も単純な回避策は、dataTableの外部のボタンからポストバックを呼び出すことです。この目的は、dataTableの部分的なページ更新だけです。 2つのポストバックが発生するため、これは最も効率的な解決策ではありませんが、うまくいきます。

は、私は、この問題のフォーム私たちの現在のPF 3.0ページのいずれかを認識し、この問題に対する私の前の回答Here

+0

このバグもありますか? –

+0

これは3.0で修正されたのは私の印象でしたが、私はこれまでに3.0を使用していませんでした。 –

+0

申し訳ありませんが、お返事ありがとうございます! –

1

userTable,somethingElseなどのコンポーネントの更新にサーバーIDを使用する場合、これらのコンポーネントは、更新をトリガーするコンポーネント(たとえば、ボタン)と同じ名前付けコンテナにある必要があります。それ以外の場合は、更新属性で次のような式を使用する必要があります。update=":usersForm:userTable"

主な問題は、命名コンテナを特定することです。外側のボタンは、ID userTableのテーブルと同じ命名コンテナ(フォーム)内にあるため、機能します。テーブル全体が更新されるためファセットが更新されますが、データテーブルはネーミングコンテナそのものなので、外側ボタンにupdate="somethingElse"を使用するだけでではなくはフッタを更新できます。

内側のボタンが機能しない理由はわかりません。私はdatatable内に別の命名コンテナがあると思います。 UIComponent実装のfindComponentアルゴリズムを使用してコンポーネントが見つからない場合、PrimeFacesはINFOを記録します。 INFO: Cannot find component with identifier "userTable" in view.

0

は、これは私が私のDataTableのフィルターを持っていた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" 
関連する問題