4

У меня есть dataTable, который доступен для редактирования (editMode = "cell").SelectBooleanCheckbox в редактируемом DataTable не изменяется

Редактирование свободного текстового поля и окна списка довольно просто. Однако я не могу понять, как изменить поле флажка. Чтобы быть более конкретным, когда я пытаюсь отредактировать выбор флажка, данные на грани вывода не будут актуализированы после внесения изменений.

<p:dataTable id="submodels" var="submodel" value="#{projectMB.submodels}" 
      editable="true" editMode="cell" widgetVar="cellSubmodels"> 
    <p:column headerText="Mapping file"> 
    <p:cellEditor> 
     <f:facet name="output"> 
     <h:selectBooleanCheckbox value="#{submodel.mapping}" onclick="return false;" 
      style="width:96%" label="Root model" readonly="true"/> 
     </f:facet> 
     <f:facet name="input"> 
     <h:selectBooleanCheckbox value="#{submodel.mapping}" style="width:96%" 
      label="Root model"/> 
     </f:facet> 
    </p:cellEditor> 
    </p:column> 
</p:dataTable> 

Что немного выше удивительное, когда я изменить входной огранку в inputText (и ввести истинное/ложное значение в нем), флажок обновляется должным образом:

<p:dataTable id="submodels" var="submodel" value="#{projectMB.submodels}" 
      editable="true" editMode="cell" widgetVar="cellSubmodels"> 
    <p:column headerText="Mapping file"> 
    <p:cellEditor> 
     <f:facet name="output"> 
     <h:selectBooleanCheckbox value="#{submodel.mapping}" onclick="return false;" 
      style="width:96%" label="Root model" readonly="true"/> 
     </f:facet> 
     <f:facet name="input"> 
     <p:inputText value="#{submodel.mapping}" style="width:96%" /> 
     </f:facet> 
    </p:cellEditor> 
    </p:column> 
</p:dataTable> 

Можете ли вы указать на то, что у меня есть сделано неправильно? Я не получаю ошибок в javascript-консоли и на стороне сервера Java.

Я использую Primefaces версии 4.0

ответ

5

Это ошибка, или по крайней мере контроль, в PrimeFaces.

В соответствии с кодом JavaScript (saveCell() function in datatable.js) он сравнивает только новое значение ввода со старым значением перед отправкой нового значения на сервер, например if (input.value != oldvalue). Однако в случае флажков (и переключателей) входное значение никогда не изменяется. Это всегда то же самое. Только проверенное состояние должно заставить браузер фактически отправить состояние на сервер или нет.

Иными словами, код JavaScript должен быть проверен, если это флажок (или радиообъект), а затем проверьте его на if (input.checked != oldchecked).

Невозможно исправить это, кроме редактирования primefaces.js/datatable.js. Вы бы выбрали report эту проблему для парней PrimeFaces и попросите их исправить ее.

В то же время вы можете обойти это, скопировав значение в скрытое поле ввода.

<f:facet name="input"> 
    <h:inputHidden value="#{submodel.mapping}" /> 
    <h:selectBooleanCheckbox value="#{submodel.mapping}" onclick="$(this).prev().val(this.checked)" /> 
</f:facet> 
+3

Именно здесь: https://github.com/primefaces/primefaces/blob/b2c095571eb81ac9ff6dd3180630e7f6c4fad115/src/main/resources/META-INF/resources/primefaces/datatable/datatable.js#L1717 –

+0

@Hatem: да, там :) – BalusC

+0

@BalusC: большое спасибо, я сообщил о проблеме на пробнике PrimeFaces (я также проверил новейшую версию PF 4.0.24, но они еще не исправили ее) – gawi