Как сохранить / сохранить значения строк при создании новой строки? - PullRequest
1 голос
/ 10 сентября 2011

У меня есть следующий bean-компонент:

public class MyBean {

public ArrayList<ReportRow> getReportRows()
    {
        return reportRows;
    }



    private final ArrayList<ReportRow> reportRows = 
        new ArrayList<ReportRow>(Arrays.asList(

                new ReportRow("","")
    ));

    public ArrayList<ReportRow> getOrderList() {

        return reportRows;

    }

    public String addAction() {

        ReportRow row = new ReportRow("", "");
        reportRows.add(row);
        return null;
    }



    public class ReportRow{

        String reportColumnName;
        String reportColumnDesc;

        public ReportRow(String reportColumnName,String reportColumnDesc) {

            this.reportColumnName=reportColumnName;
            this.reportColumnDesc=reportColumnDesc;
        }

        public String getReportColumnName()
        {
            return reportColumnName;
        }

        public void setReportColumnName(String reportColumnName)
        {
            this.reportColumnName = reportColumnName;
        }

        public String getReportColumnDesc()
        {
            return reportColumnDesc;
        }

        public void setReportColumnDesc(String reportColumnDesc)
        {
            this.reportColumnDesc = reportColumnDesc;
        }

    }

}

jsf page:

<t:dataTable value="#{myBean.reportRows}" var="o"
            id="reportColumnsTable" styleClass="standardTable" headerClass="standardTable_Header"
            rowStyleClass="#{myBean.viewDelayedRsd}"
            >

            <h:column>

            <t:outputLabel value="Column name:"></t:outputLabel>
            <t:inputText id="ReportColumnName" value="#{o.reportColumnName}" required="true">
            </t:inputText>

            </h:column>

            <h:column>

            <t:outputLabel value="Column Desc:"></t:outputLabel>
            <t:inputText id="ReportColumnDesc" value="#{o.reportColumnDesc}" >

            </t:inputText>

            </h:column>

            <h:column>

            <h:outputLink value="#add"><h:outputText value="Add"/>
                        <a4j:support ajaxSingle="true" event="onclick" action="#{rprtBean.addAction}"
                        reRender="reportColumnsTable,msgPanel" />                       
            </h:outputLink>

            </h:column>

            </t:dataTable>

Проблема заключается в том, что когда я нажимаю на add, он генерирует новую строку и очищает старую., и я хочу сохранить значения старой строки, какие-либо идеи?

Ответы [ 2 ]

4 голосов
/ 10 сентября 2011

Вы используете <h:outputLink> вместо <h:commandLink>. <h:outputLink> не отправляет форму вообще, он запускает простой запрос GET. <a4j:support> не будет работать должным образом внутри <h:outputLink>. Замените его на <h:commandLink>:

<h:commandLink value="Add" action="#{rprtBean.addAction}">
    <a4j:support reRender="reportColumnsTable,msgPanel" ajaxSingle="true" />
</h:commandLink>

Затем вам нужно убедиться, что вы сохранили модель данных для последующего запроса на тот случай, если ваш бин находится в области запроса. Для этого есть несколько способов:

  1. Установить либо Таблица данных Томагавк preserveDataModel до true:

    <t:dataTable preserveDataModel="true">
    
  2. Или сохранить состояние компонента в области просмотра. Добавьте следующий тег где-нибудь на странице:

    <t:saveState value="#{myBean}" />
    

    или поскольку вы также используете RichFaces / Ajax4jsf:

    <a4j:keepAlive beanName="myBean" />
    
1 голос
/ 12 сентября 2011

Я просто использовал командную ссылку a4j, и все работало нормально.

...