1

我在这里有一个我不明白的行为。我正在使用 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),任务也将被添加,但对话框当然保持打开状态。如果我按下取消,对话框关闭并且表格得到更新,我可以看到新任务。

我无法解释这一点,也许你们中的一个可以?

提前致谢

4

0 回答 0