Primefaces: сохранить в БД, используя ajax для тега inplace - PullRequest
2 голосов
/ 10 января 2012

Еще один вопрос от меня о простых лицах (java, jsf). У меня ManagedBean с таким кодом:

@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 и пытаюсь изменить значения на странице. После изменения значения поля на странице программа остановилась на точке останова, и я вижу объект, который сохраняется в БД - есть старые значения (которые были извлечены из БД). И на странице старые значения тоже (это разумно, потому что «старый» аккаунт был обновлен). Я использую Primefaces 3.0.RC2. Возможно, проблема в атрибуте ajax «event» (я использую «save», но в руководстве пользователя Primefaces я не нашел других вариантов для такой ситуации). Пожалуйста, помогите мне с моей проблемой.

Ответы [ 2 ]

1 голос
/ 10 января 2012

Кажется, ваш мисс h:form элемент. Каждое действие, которое отправляется на сервер (например, ajax), должно быть помещено внутри элемента form. Смотри http://www.primefaces.org/showcase/ui/ajaxifyKeyEvents.jsf

0 голосов
/ 11 января 2012

Решите мою проблему, используя commandButton.

<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 с заголовком «Сохранить», который отключается при загрузке страницы. После редактирования одного или нескольких значений учетной записи на странице кнопка активируется кодом:

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

После нажатия кнопки «Сохранить» он отключается - я использую атрибут oncomplete:

oncomplete="saveAccount.disable();"

Были проблемы с отключением атрибута commandButton , поэтому я просто код jQuery, который отключает кнопку после загрузки страницы:

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

Но вопрос о проблеме с сохранением встроенных значений в БД все еще актуален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...