Получение значения NULL, переданного в функцию Java через BootsFaces datatable - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь создать модал для отправки выбранных пользователем запросов на адрес электронной почты; Однако у меня возникают проблемы при получении выбранных пользователем запросов. Я продолжаю получать нулевое значение, переданное через fooBean.setSelected(id).


Версия:

  • BootsFaces: 1.3.0
  • Java: 1.8.0
  • JSF: 2,0
  • Браузер: Internet Explorer 11.2x

MCVE thisThing.xhtml:

<b:dataTable value="#{fooBean.newRequests}"
    var="foo"
    onselect="ajax:fooBean.setSelected(id)"
    ondeselect="ajax:fooBean.setSelected(id)"
    selectedItems="row"
    selection-mode="multiple"
    selectedRows="#{foo.selected}"
    saveState="false">

    <b:dataTableColumn label="Select">
        <b:selectBooleanCheckbox value="#{foo.selected}" />
    </b:dataTableColumn>

    <b:dataTableColumn label="Status" value="#{foo.status}" />

    <b:dataTableColumn label="Request Number"
        value="#{foo.requestNumber}"
        data-type="string" />

    <b:dataTableColumn label="ID" value="#{foo.id}" />

    <b:dataTableColumn value="#{foo.storeName}"
        label="Store Name" />
</b:dataTable>

MCVE из fooBean.java:

@ManagedBean(name="fooBean")
@ViewScoped
public class fooBean extends BeanBase implements Serializable {

    private List<FooRecord> fooRecords = new ArrayList<FooRecord>();
    private List<FooRecord> selectedFooRecords = new ArrayList<FooRecord>();

    // ...

    public void setSelected(String requestId) {
        // This is not how I really do it, but it gives an idea
        // with what I intend to do.
        this.fooRecords.stream().filter(...).toggleSelection();
        this.selectedFooRecords.stream().filter(...).toggleSelection();
    }
}

Обновление:

Я обнаружил, что у меня есть метод, называемый getSelect вместо getSelected, поэтому я исправил его, и эта часть выполнена. Я только что вспомнил реальную проблему, которая заключается в том, что вместо requestId передается нулевой параметр. Когда я отлаживаю через fooBean.getSelected(String requestId), в качестве параметра передается null. Я даже попробовал:

<!-- Using varName.property -->
onselect="ajax:fooBean.setSelected(foo.id)"

<!-- Using just the property name -->
onselect="ajax:fooBean.setSelected(id)"

<!-- Using the loop variable -->
onselect="ajax:fooBean.setSelected(foo)"

Обновление 2:

Fired function with null parameter

Как передать foo.id в функцию?

1 Ответ

0 голосов
/ 08 декабря 2018

Методу bean-компонента можно передать только три параметра:

  • Переменная цикла. В вашем примере это foo. Этот параметр работает только в том случае, если для атрибута selected-items установлено значение rows. Предостережение: если вы активируете режим выбора столбца или ячейки, этот параметр по-прежнему передается на сервер и кажется действительным. Только то, что каждый атрибут этого объекта является нулевым.
  • typeOfSelection. Это либо "row", "column", либо "item". Он определяет, что выбрал пользователь. Это, в свою очередь, определяется атрибутом selected-items, поэтому вам вряд ли когда-нибудь придется использовать этот параметр. Просто опустите его из списка параметров.
  • indexes сообщает бину JSF, какие строки, столбцы или ячейки были выбраны. Обратите внимание, что в первых двух случаях это либо отдельный номер, либо, если выбрано несколько элементов, список через запятую. Если вы установили selected-items = "cell", indexes - это список объектов через запятую, содержащий индекс строки и столбца.

Полагаю, indexes или foo - самый полезный параметр в вашем случае.

Последнее замечание: мы хотели бы добавить больше гибкости, но это требует гораздо большего понимания внутреннего API JSF, чем даже у нас. По правде говоря, я даже не уверен, что мы можем передавать произвольные значения bean-компонентов без изменения самого движка JSF. Если кто-нибудь знает, как это сделать, пожалуйста, оставьте сообщение на наш баг-трекер .

Обновление: Возможно проблема вызвана модалом. Модал отображается во время загрузки, но отображается позже, когда пользователь выбрал строку. Дело в том, что модальное изображение не перерисовывается автоматически, если вы не добавите содержимое модального атрибута update.

...