关于primefaces(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上设置断点并尝试更改页面上的值。在页面上更改字段值后,程序在断点处暂停,我可以看到保存到DB的对象 - 有旧值(从db中提取)。在页面上旧值也是(这是合理的,因为“旧”帐户已更新)。我使用primefaces 3.0.RC2。可能是问题是在ajax属性“事件”(我使用“保存”,但在Primefaces用户指南我没有找到这种情况的其他变种)。请帮我解决我的问题。
答案 0 :(得分:1)
看来你错过了h:form
元素。发送到服务器的每个操作(例如ajax)都必须放在form
元素内。见http://www.primefaces.org/showcase/ui/ajaxifyKeyEvents.jsf
答案 1 :(得分:0)
使用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>
托管bean中的小变化:
public void saveAccount() {
accountController.update(account);
// extract info for page
// extractAccount();
}
Explenation。我创建了标题为“保存”的commandButton,在加载页面时禁用。在页面上编辑一个或多个帐户值后,按钮由代码启用:
<p:ajax event="save" onsuccess="saveAccount.enable();"/>
按下“保存”按钮后,它被禁用 - 我使用属性oncomplete:
oncomplete="saveAccount.disable();"
有problems with commandButton attribute disable,所以我简单的jQuery代码,它使按钮在加载页面后被禁用:
<script type="text/javascript">$(document).ready(function() {saveAccount.disable();});</script>
但是关于将内联值保存到DB的问题仍然存在。