2012-01-10 5 views
2

primefaces(java、jsf)についてもう1つ質問があります。 私はそのようなコードでManagedBeanを持っている:Primefaces:inplaceタグにajaxを使用してdbに保存

@ManagedBean 
@SessionScoped 
public class AccountManagedBean { 
    private Long id = (long) 1; 
    private Account account = new Account(); 
    private AccountJpaController accountController = new AccountJpaController(); 

    public void AccountManagedBean() { 
     extractAccount(); 
    } 

    public void saveAccount() { 
     accountController.update(account); 
     // extract info for page 
     extractAccount(); 
    } 

    public void extractAccount() { 
     account = accountController.get(id); 
    } 

    public Account getAccount() { 
     return account; 
    } 

    public void setAccount(Account account) { 
     this.account = account; 
    } 
} 

とXHTMLファイル - ビューの一部:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:c="http://java.sun.com/jsp/jstl/core"> 

<h:body> 
     <p:panel id="account"> 
         <h:panelGrid columns="2" columnClasses="column" cellpadding="5"> 
          <h:outputText value="Balance: " /> 
          <p:inplace editor="true"> 
           <p:ajax event="save" listener="#{accountManagedBean.saveAccount}" update="account" /> 
           <p:inputText value="#{accountManagedBean.account.balance}" required="true"/> 
          </p:inplace> 

          <h:outputText value="Credit limit: " /> 
          <p:inplace editor="true" > 
           <p:ajax event="save" listener="#{accountManagedBean.saveAccount}" update="account" /> 
           <p:inputText value="#{accountManagedBean.account.creditLimit}" required="true"/> 
          </p:inplace> 

          <h:outputText value="Comment: " /> 
          <p:inplace editor="true"> 
           <p:ajax event="save" listener="#{accountManagedBean.saveAccount}" update="account" /> 
           <p:inputText value="#{accountManagedBean.account.comment}"/> 
          </p:inplace> 
         </h:panelGrid> 
     </p:panel> 
</h:body> 

問題は、編集された情報を保存してあります。 saveAccountメソッドでブレークポイントを設定し、ページ上の値を変更しようとしました。ページ上のフィールド値を変更すると、プログラムはブレークポイントで一時停止し、DBに保存しているオブジェクトを見ることができます - 古い値(dbから抽出されたもの)があります。また、ページ上で古い値もあります(「古い」アカウントが更新されたため)。私はプライムフェイス3.0.RC2を使用します。 Ajax属性の "イベント"に問題がある可能性があります(私は "保存"を使用しますが、Primefacesのユーザーガイドではこのような状況で他のバリエーションは見つかりませんでした)。私の問題を助けてください。

+0

あなたの問題は何ですか? –

+0

アカウントオブジェクト内のフィールド(ページ上)を編集した後に何も変更されなかったため、アカウントフィールドを変更してオブジェクトをDBに保存できません。 – Nazar

答えて

0

CommandButtonを使用して問題を解決してください。管理対象Beanで

<h:form> 
         <p:panel id="account"> 
          <h:panelGrid columns="2" columnClasses="column" cellpadding="5"> 
           <h:outputText value="Balance: " /> 
           <p:inplace editor="true"> 
            <p:ajax event="save" onsuccess="saveAccount.enable();"/> 
            <p:inputText value="#{accountManagedBean.account.balance}" required="true"/> 
           </p:inplace> 

           <h:outputText value="Credit limit: " /> 
           <p:inplace editor="true" > 
            <p:ajax event="save" onsuccess="saveAccount.enable();"/> 
            <p:inputText value="#{accountManagedBean.account.creditLimit}" required="true"/> 
           </p:inplace> 

           <h:outputText value="Comment: " /> 
           <p:inplace editor="true"> 
            <p:ajax event="save" onsuccess="saveAccount.enable();"/> 
            <p:inputText value="#{accountManagedBean.account.comment}"/> 
           </p:inplace> 

           <p:commandButton title="Save account changes" value="Save" widgetVar="saveAccount" action="#{accountManagedBean.saveAccount}" oncomplete="saveAccount.disable();" /> 
          </h:panelGrid> 
         </p:panel> 

         <script type="text/javascript">$(document).ready(function() {saveAccount.disable();});</script> 

        </h:form> 

小さな変化:

public void saveAccount() { 
     accountController.update(account); 
     // extract info for page 
     // extractAccount(); 
    } 

Explenation。タイトルが「保存」のcommandButtonを作成します。これは、ページが読み込まれると無効になります。

oncomplete="saveAccount.disable();" 

problems with commandButton attribute disableはそう、ありました:私は、onCompleteの属性を使用する - それが無効になっているボタンを「保存」押した後

<p:ajax event="save" onsuccess="saveAccount.enable();"/> 

:ページ上の1つのまたはそれ以上のアカウント値はボタンがコードでは有効になって編集した後Iロードページaftet無効ボタンを作るシンプルなjQueryのコード、:

<script type="text/javascript">$(document).ready(function() {saveAccount.disable();});</script> 

しかし、DBへのインライン値を保存して、問題についての質問はまだ実際のです。

+0

この問題を解決できましたか?私はPrimefaces 4とJSF 2.2を実行していますが、デフォルトの保存ボタンをクリックするとこのコンポーネントを保存することはできません。何らかの理由でバッキングBeanメソッドが呼び出されることはありません。キャンセルメソッドが常に呼び出されるため、本当に奇妙です。何かご意見は? –

1

あなたの欠場のようですh:form要素。サーバーに送信するすべてのアクション(例:ajax)は、form要素内に配置する必要があります。 http://www.primefaces.org/showcase/ui/ajaxifyKeyEvents.jsf

+0

これはコードスニペットの過度の単純化ではないと思います。 OPは明示的に値が保存されていると述べました。これは ' 'がなければ不可能です。 – BalusC

+0

私はで試しました。何も変わりません。 – Nazar

+0

ありがとうございます - これはおそらく元の質問に対する答えではありませんが、私の場合は助けになりました。インプレースタグの値が ''なしで保存されませんでした – Micer

関連する問題