我在这里有一个我不明白的行为。我正在使用 Spring 3.1、Primefaces 3.3.1 和 JSF 2。
我正在使用数据表并希望通过表单中的对话框添加一行。这是我的表格,包括调用对话框的按钮:
<h:form id="form">
<!-- open the dialog on click -->
<p:commandButton value="New" onclick="dlgAddTask.show()"
update="taskList" />
<p:dataTable var="task" value="#{taskBean.tasks}" id="taskList"
widgetVar="taskList" editable="true" rowkey="task.id"
paginator="true" rows="50"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="25,50,100">
<p:ajax event="rowEdit" update="@this" listener="#{taskBean.save}" />
<p:column headerText="Name" style="width:125px">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{task.name}" style="width:100%" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{task.name}" style="width:100%" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="width:20px">
<p:rowEditor />
</p:column>
</p:dataTable>
</h:form>
这是我与相关 javascript 的对话(与表格的形式相同):
<p:dialog id="dlgAddTask" header="Add New Task" widgetVar="dlgAddTask">
<h:form>
<h:panelGrid columns="2" cellpadding="5" width="500">
<h:outputLabel for="name" value="Name" />
<p:inputText value="#{addTaskBean.name}" id="name" required="true"
label="name" />
<h:outputLabel for="description" value="Description:" />
<p:inputTextarea value="#{addTaskBean.description}"
id="description" label="description" />
<h:outputLabel for="dueTo" value="Due To:" />
<p:calendar value="#{addTaskBean.dueTo}" id="dueTo" label="dueTo" />
<h:outputLabel for="done" value="Done:" />
<p:selectBooleanCheckbox value="#{addTaskBean.done}" id="done"
label="done" />
<f:facet name="footer">
<p:commandButton id="addButton" value="Add"
actionListener="#{addTaskBean.addTask}"
oncomplete="handleLoginRequest(xhr, status, args)" />
<p:commandButton value="Cancel" onclick="dlgAddButton.hide()" />
</f:facet>
</h:panelGrid>
</h:form>
</p:dialog>
<script type="text/javascript">
function handleLoginRequest(xhr, status, args) {
if (args.validationFailed || !args.taskAdded) {
jQuery('#dialog').effect("shake", {
times : 3
}, 100);
} else {
dlgAddTask.hide();
}
}
</script>
</h:form>
这是我的 Bean(省略了 getter 和 setter):
public class AddTaskBean {
@Inject
TaskDao taskDao;
private boolean done;
private String name;
private String description;
private Date dueTo;
@Transactional
public void addTask() {
RequestContext context = RequestContext.getCurrentInstance();
FacesMessage msg = null;
Task task = new Task();
boolean taskAdded = false;
task.setDescription(getDescription());
task.setDone(isDone());
task.setDueTo(getDueTo());
task.setName(getName());
if (taskDao.persist(task) != null) {
taskAdded = true;
msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Task",
getName() + " added.");
} else {
taskAdded = false;
msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Task Error",
"Something went wrong on adding task.");
}
FacesContext.getCurrentInstance().addMessage(null, msg);
context.addCallbackParam("taskAdded", taskAdded);
}
现在,如果我打开对话框,添加一个任务,它会一直运行到更新点。所以我在数据库中有一个新任务,对话框关闭,但表没有更新。按 F5 会显示表格中的新任务。
但是(请仔细阅读,因为这对我来说有点棘手),如果我在添加任务后不关闭对话框(通过不通过 oncomplete="handleLoginRequest(xhr, status, args)" 调用 javascript),任务也将被添加,但对话框当然保持打开状态。如果我按下取消,对话框关闭并且表格得到更新,我可以看到新任务。
我无法解释这一点,也许你们中的一个可以?
提前致谢