Редактирование ячейки данных Primefaces не обновляется

У меня есть таблица данных Primefaces с редактированием ячеек, которая переключается на логическую переменную в представлении.

У меня есть три проблемы:

  1. В режиме редактирования я изменяю значение и нажимаю кнопку «Сохранить» на странице, оно не сохраняет новое значение. Если я сначала нажму в любом другом месте на странице, а затем нажму «Сохранить», оно сохранит значение. Мне нужно, чтобы это значение сохранялось, если вы сначала нажмете «Сохранить».
  2. Если я редактирую ячейку, которая является входным текстом, и я выбираю поле, теперь это выходной текст, пока я не щелкну там снова. Я хочу, чтобы поле выглядело как вводимый текст в режиме редактирования.
  3. Когда нажимается кнопка сохранения, вспомогательный метод устанавливает для редактируемого логического значения значение false, и остальная часть страницы подчиняется, и dataTable выглядит так, как будто он подчиняется, но если вы щелкнете ячейку, она позволит вам редактировать ее.

Вот код:

<p:dataTable value="#{view.LineItems}" var="lineItem" rowKey="#{lineItem.lineItemId}"
                 resizableColumns="false" editable="#{view.editable}" editMode="cell"
                 editingRow="#{view.editable}" id="requestLineItemsTable">

        <p:ajax event="cellEdit" listener="#{view.cellEdited}" immediate="true" update="@this" />

        <p:column styleClass="centerColumnData" headerText="Item Name" style="width: 140px;">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{lineItem.title}"/>
                </f:facet>
                <f:facet name="input">
                    <h:inputText value="#{lineItem.title}"/>
                </f:facet>
            </p:cellEditor>
        </p:column> ...

а это бэкэнд (с этим пока ничего не делаю)

public void cellEdited(CellEditEvent event)
{
    Object oldValue = event.getOldValue();
}

а вот кнопки сохранения и редактирования на той же странице .xhtml, что и datatable

 <p:commandLink process="@this"
                       action="#{view.changeModeToEdit}"
                       update="@form"
                       rendered="#{!view.editMode">
            <h:graphicImage library="images" name="edit20.png" title="#{__Common.edit}"
                            style="height: 15px; width: 15px;"/>
        </p:commandLink>
<components:linkWithSpinner linkStyle="margin-right: 20px;" loadingImageStyle="margin-right: 20px;"
                                    linkStyleClass="activeButton saveButtonRequestDetails" loadingImageStyleClass="saveButtonRequestDetails"
                                    linkText="#{__CommonButton.save}"
                                    process="@form" update="@form"
                                    actionMethod="#{view.updateRequest()}"/>

view.updateRequest() устанавливает для редактируемого значение false. Я использую Праймфейс 4.0


person dsievers    schedule 12.06.2014    source источник
comment
Я обновился до Primefaces 5 и исправил проблему 3, затем, чтобы исправить проблему 1, мне пришлось добавить async=true к p: ajax, теперь он не будет пытаться запустить ajax после нажатия кнопки сохранения. Мне нужно тщательно проверить это сейчас, когда вызов ajax является асинхронным.   -  person dsievers    schedule 18.06.2014


Ответы (1)


Поэтому я нашел способ обойти эти проблемы. Я был сосредоточен на использовании встроенной таблицы редактирования, но вы можете просто иметь обычную таблицу данных, а столбцы могут содержать текстовые поля ввода. Тогда вам не нужно беспокоиться о большинстве проблем в моем вопросе выше. Если вам нужно переключаться между редактируемым и нередактируемым представлением, я до сих пор не знаю, как это полностью исправить, за исключением того, что в вашем файле есть две таблицы данных с тегами рендеринга, но тогда вы дублируете таблицу: одну с текстовыми полями ввода, а другую с вывод текстовых полей, и это не лучший способ сделать это.

person dsievers    schedule 04.11.2014