PrimeFaces. Выбранные строки с данными и форма диалога

У меня есть следующий код JSF:
Кнопка:

        <p:layoutUnit id="centerLayoutUnit" position="center">
            <h:form id="form" styleClass="my_form">

                <p:growl id="msgs" showDetail="false" />

                <p:toolbar id="alarmTableToolbar">
                    <p:toolbarGroup align="left">
                        <p:commandButton value="Ack/comment" disabled="false"
                            action="#{alarmTable.checkAllSelectedAlarmsIsInOneAckCondition()}"
                            icon="ui-icon-close" update="msgs :ackDialog"
                            style="min-width : 75px; height : 26px" />

........

И в таком же виде и layoutUnit dataTable:

                <p:dataTable id="alarmTable" value="#{alarmTable.alarms}"
                    selection="#{alarmTable.selectedAlarm}" selectionMode="multiple"
                    var="alarm" resizableColumns="true" paginator="true" rows="50"
                    emptyMessage="No alarms" sortBy="#{alarm.alarmTs}"
                    sortOrder="descending"
                    paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                    rowsPerPageTemplate="25, 50, 75, 100" lazy="true"
                    style="table-layout: auto" dblClickSelect="true">

Диалог в том же LayoutUnit, но в другой форме:

            <p:dialog id="ackDialog" header="Acknowledge/comment dialog"
                widgetVar="ackDlg" modal="false" height="143" width="285"
                dynamic="false" resizable="false" appendToBody="false">

                <h:form id="formAckDialog">
                    <h:selectOneMenu id="ackTemplate"
                        value="#{alarmTable.selectedIdOfAckTemplate}" required="false"
                        disabled="#{alarmTable.checkSelectedAlarmsIsAck()}">
                        <f:selectItem itemLabel="template selection" itemValue="" />
                        <f:selectItems value="#{alarmTable.initAckTemplatesName()}" />
                    </h:selectOneMenu>

                    <p:inputTextarea rows="4" cols="47" counter="counter"
                        maxlength="1024" counterTemplate="{0} characters remaining."
                        autoResize="true" value="#{alarmTable.commentText}" />
                    <h:outputText id="counter" />

                    <div align="right">
                        <p:commandButton id="ackComment" value="Ack/comment" disabled="false"
                            actionListener="#{alarmTable.sumbitAckComment}"
                            update=":form:msgs" style="min-width : 75px; height : 26px;" />
                    </div>
                </h:form>
            </p:dialog>

AlarmTable это bean-компонент с:

@ManagedBean
@SessionScoped

и поле:

private MyClass[] selectedAlarm;

И методы:

 public boolean checkAllSelectedAlarmsIsInOneAckCondition() {
    if (selectedAlarm == null || selectedAlarm.length == 0) {
        JSFUtil.addErrorMessage("No alarms are selected");
        return false;
    }

    RequestContext context = RequestContext.getCurrentInstance();
    for (AlarmMts alarm : selectedAlarm) {
        if (!selectedAlarm[0].isAck.equals(alarm.isAck)) {
        JSFUtil.addErrorMessage("Not all selected alarms are acknowledged or not acknowledged");
        return false;
        }
    }
    context.execute("ackDlg.show()");
    return true;
    }

public boolean checkSelectedAlarmsIsAck() {
    if (selectedAlarm == null || selectedAlarm.length == 0)
        return false;
    for (AlarmMts alarm : selectedAlarm) {
        if (!alarm.isAck.equals(new BigDecimal(1)))
        return false;
    }
    return true;
}


public void sumbitAckComment(ActionEvent actionEvent) {
    boolean closeDialog = false;
    if ((selectedIdOfAckTemplate == null || selectedIdOfAckTemplate.equals(new BigDecimal(0))) && commentText.isEmpty())
        JSFUtil.addErrorMessage("Please fill in something");
    if (selectedIdOfAckTemplate != null && !selectedIdOfAckTemplate.equals(new BigDecimal(0))) {
        closeDialog = ackSelectedAlarms(Factory.getInstance().getAcknowledgeTemplateDAO().getAckTemplateById(selectedIdOfAckTemplate));
    }
    if (commentText != null && !commentText.isEmpty()) {
        closeDialog = commentSelectedAlarms(commentText);
    }
    if (closeDialog) {
        RequestContext.getCurrentInstance().execute("ackDlg.hide()");
    }
}

Таким образом, проблема заключается в том, что когда во время создания диалога вызываются методы checkAllSelectedAlarmsIsInOneAckCondition() и checkSelectedAlarmsIsAck(), они имеют правильные (!= null) выбранные элементы в selectedAlarm. сильное> поле. Но когда пользователь нажимает кнопку - ackComment в диалоговом окне, selectedAlarm имеет значение null. Любое предложение?


person Divers    schedule 01.08.2012    source источник


Ответы (1)


Я не понимаю почему, но когда я изменил SessionScope на ViewScope, он стал работать как положено.

person Divers    schedule 02.08.2012