SelectBooleanCheckbox в редактируемом DataTable не меняется

У меня есть редактируемая таблица данных (editMode = "cell").

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

<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 (и ввожу в него значение true/false), флажок обновляется правильно:

<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.


person gawi    schedule 09.01.2015    source источник


Ответы (3)


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

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

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

Нет другого способа исправить это, кроме как отредактировать файл primefaces.js/datatable.js. Лучше всего сообщить об этой проблеме ребятам из PrimeFaces и попросить их исправить ее.

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

<f:facet name="input">
    <h:inputHidden value="#{submodel.mapping}" />
    <h:selectBooleanCheckbox value="#{submodel.mapping}" onclick="$(this).prev().val(this.checked)" />
</f:facet>
person BalusC    schedule 09.01.2015
comment
Именно здесь: github.com/primefaces/primefaces/blob/ - person Hatem Alimam; 09.01.2015
comment
@Hatem: да, там :) - person BalusC; 09.01.2015
comment
@BalusC: большое спасибо, я сообщил о проблеме в системе отслеживания проблем PrimeFaces (я также проверил новейшую версию 4.0.24 PF, но они еще не исправили ее) - person gawi; 13.01.2015
comment
Я использую PrimeFaces 5.1 и пытался использовать приведенный выше код, но это не сработало. Однако я оставил кнопку проверки без каких-либо аспектов ввода или вывода. Он остается редактируемым и работает нормально. Это просто не единообразно со всем процессом. Я не уверен, почему они не выпустили патч для этой проблемы, или он уже есть в версии Elite? - person Mohamed Ennahdi El Idrissi; 16.03.2015
comment
Более того, я только что протестировал с editMode=cell и editMode=row, и он работал, как и ожидалось (как с вводом, так и с выводом граней). - person Mohamed Ennahdi El Idrissi; 16.03.2015
comment
Ссылка на локацию больше не работает, была github.com/primefaces/primefaces/blob/master/src/main/resources/ тот? - person Kukeltje; 12.05.2016
comment
Единственная проблема с вышеупомянутыми аспектами p:celleditor и ввода/вывода заключается в том, что если вы разрешите удаление строки из таблицы, например, с помощью commandLink, значения в этих столбцах не останутся со строками, которые перемещаются в результате удаления. Как ни странно, это было принято в качестве решения, когда об ошибке было сообщено [github.com/primefaces/primefaces/issues/1854]. Однако между всем этим мне удалось найти довольно простой обходной путь, который я опубликую в качестве альтернативного ответа. - person Kevin Rahe; 17.04.2019

В PrimeFaces 7.0 я придумал довольно простой обходной путь. (Это также может работать с более ранними версиями PrimeFaces — не проверял их.)

Просто включите AJAX на флажке и обновите dataTable:

(Обратите внимание, что я использую p:selectBooleanCheckbox; также обратите внимание, что для этого требуется update="<datatable id>" — вы не можете просто вставить <p:ajax />)

  <f:facet name="input">
    <p:selectBooleanCheckbox value="#{submodel.mapping}" style="width:96%" 
       label="Root model">
      <p:ajax update="submodels" />
    </p:selectBooleanCheckbox>
  </f:facet>
person Kevin Rahe    schedule 17.04.2019

Это было исправлено для PF 7.1, см. этот PR: https://github.com/primefaces/primefaces/pull/5095

person Melloware    schedule 27.08.2019