Когда я пытаюсь обновить ячейки в h: dataTable, это не будет сделано - PullRequest
1 голос
/ 18 ноября 2011

У меня есть h: dataTable с данными, сгенерированными из ArrayList с пользовательским объектом Result. Когда я пытаюсь включить редактирование ячеек, я не могу этого сделать. Я подозреваю, что он запрашивает данные с сервера и отменяет мой последний выбор.

Моя <h:dataTable> форма и полный документ xhtml

<!-- language: xhtml -->
<?xml version='1.0' encoding='UTF-8' ?>
<!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">
    <h:head>
        <title>IGNORED</title>
    </h:head>
    <h:body>
        <ui:composition template="../templates/masterLayout.xhtml">
            <ui:define name="windowTitle"> #{msgs.viewResultsTitle}</ui:define>
            <ui:define name="content">
                <h:form>
                    <h:dataTable value="#{managedBean.viewResultList}" var="res"
                                 styleClass="tracks"
                                 headerClass="trackHeader"
                                 columnClasses="oddColumn,evenColumn">
                        <h:column>
                            <f:facet name="header">#{msgs.trackID}</f:facet>
                                #{res.track_name}
                        </h:column>
                        <h:column>
                            <f:facet name="header">#{msgs.startnumber}</f:facet>
                                <h:inputText value="#{res.startnumber}" size="5" rendered="#{res.editable}" />
                                <h:outputText value="#{res.startnumber}" rendered="#{not res.editable}" />
                        </h:column>
                        <h:column>
                            <f:facet name="header">#{msgs.time}</f:facet>
                                <h:inputText value="#{res.time}" size="10" rendered="#{res.editable}" >
                                    <f:validator validatorId="ResultValidator" />
                                    <f:converter converterId="ResultConverter" />                                    
                                </h:inputText>
                                <h:outputText value="#{res.time}" rendered="#{not res.editable}" />
                        </h:column>
                        <h:column>
                            <f:facet name="header">#{msgs.runnerID}</f:facet>
                                #{res.runner_name}
                        </h:column>
                        <h:column>
                            <f:facet name="header">#{msgs.divID}</f:facet>
                                #{res.division_value}
                        </h:column>
                        <h:column>
                            <h:commandLink value="#{msgs.edit}" action="#{managedBean.editAction(res)}" rendered="#{not res.editable}"/>
                       </h:column>
                        <h:column>
                                <h:commandLink value="#{msgs.saveChanges}" action="#{managedBean.saveAction(res)}" />
                       </h:column>
                </h:dataTable>
            </h:form>
            </ui:define>
        </ui:composition>
    </h:body>
</html>

Он вызывает managedBean.editAction, который выглядит следующим образом:

public String editAction(Result result) {
result.setEditable(true);
return null;
}

Он в основном устанавливает все объекты результатов в редактируемые. Но когда я нажимаю, он загружает страницу, и ничего не происходит.

Я следовал за тобой на www.mkyoung.com jsf tutorial

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Не зная, как выглядит ваш managedBean, вот несколько советов:

  • viewResultList() не должен обновлять список результатов, а только возвращать его.В противном случае изменения записей в этом списке могут быть перезаписаны, если вы сначала не обновите свою модель (например, запишите их в базу данных, если загрузите результаты оттуда).
  • result.setEditable(true);, кажется, ссылается на один объект в вашем списке, или он может даже ссылаться на объект , а не в этом списке.Обратите внимание, что только этот объект установлен для редактирования.

    Если вы хотите сделать все записи редактируемыми, вы должны либо установить глобальное свойство в управляемом бине и проверить его в своей таблице, либо выполнить итерацию по списку результатов и вызвать setEditable(true) для каждый запись в этом списке.

    Обратите внимание, что в следующем примере editAction() фактически принимает параметр объекта order, который определяет, какая запись в orderList будет установлена ​​в редактируемый.
0 голосов
/ 19 ноября 2011

Большое спасибо за помощь.

Я разобрался с проблемой.Это было с того, откуда данные были заполнены -> база данных.И editAction(res) спасло государство местному архивисту.Поэтому, когда я обновил editable, он не был сохранен в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...