Реализация «Выбрать все флажки» в заголовке rich: dataTable - PullRequest
2 голосов
/ 22 февраля 2012

Я пытаюсь установить флажок «выбрать все флажки» в заголовке rich: dataTable без использования JavaScript.

XHTML:

<rich:column styleClass="center-aligned-text">
    <f:facet name="header">
        <h:selectBooleanCheckbox id="selectAll" title="selectAll" valueChangeListener="#{workspace.selectAllComponents}">
            <a4j:support event="onclick" reRender="listcomponents"/>
        </h:selectBooleanCheckbox>
    </f:facet>

    <h:selectBooleanCheckbox id="selectComponent" value="#{workspace.selectedComponentIds[componentInfo.id]}" />
</rich:column>

Фасоль:

public void selectAllComponents(ValueChangeEvent event) {
    if (!selectAll) {
        changeMap(selectedComponentIds,true);
        setSelectAll(true);
    } else { 
        changeMap(selectedComponentIds,false);
        setSelectAll(false);
    }
}


public void changeMap(Map<Long,Boolean> selectedComponentMap, Boolean blnValue) {
    if(selectedComponentMap != null) {
        Iterator<Long> itr = selectedComponentMap.keySet().iterator();
        while(itr.hasNext()) {
            selectedComponentMap.put(itr.next(), blnValue);
        }
        setSelectedComponentIds(selectedComponentMap);
    }
}

Ответ, который я нашел здесь:

if (event.getPhase() != PhaseId.INVOKE_APPLICATION) {
    event.setPhase(PhaseId.INVOKE_APPLICATON);
    event.queue();
} else {
   //do your stuff here
}

не складывается, потому что getPhase() недоступен в событии ValueChangeEvent. Я вижу только getPhaseId(), который содержит опцию INVOKE_APPLICATION, поэтому мой вопрос состоит в том, как я могу достичь своих функциональных требований с помощью приведенного выше ответа? Или есть альтернатива?

Ответы [ 3 ]

3 голосов
/ 23 февраля 2012

valueChangeListener выполняет свою работу на этапе проверки процесса.Однако при отправке всей формы отправленные значения переопределяют измененные значения valueChangeListener на этапе обновления значений модели.Вы действительно хотите выполнить задание «Выбрать все» на этапе «Вызов действия».

Лучше просто позволить JSF пропустить все оставшиеся фазы в методе valueChangeListener до ответа рендеринга, чтобы измененные значения не были переопределены.Вы можете достичь этого, вызвав FacesContext#renderResponse() в методе valueChangeListener.

public void selectAllComponents(ValueChangeEvent event) {
    selectAll = !selectAll;
    changeMap(selectedComponentIds, selectAll);
    FacesContext.getCurrentInstance().renderResponse();
}
0 голосов
/ 14 февраля 2014

Вы должны взглянуть на эту ссылку:

Установите флажок Все в JSF без использования Javascript

Надеюсь, это поможет =) Mike

0 голосов
/ 24 февраля 2012

Я реализовал это с помощью флажка в фасете заголовка таблицы данных, но с помощью простого jquery, который выбирает все флажки в строках этой таблицы.

Если вы хотите избежать js и можете жить, не обновляя выбор таблицы, но просто используйте флажок select all как таковой. Вы можете просто сопоставить его с bean-компонентом и обработать это в своем приложении с помощью действия a4j (слушатель), в котором вы обновите выбранные идентификаторы и обновите таблицу.

Есть еще кое-что, что, вероятно, могло бы упростить ваш обработчик выбора: я создал универсальный selectablewrapper для entityquery, который содержит логическое значение и сущность результатов, полученных от entityquery. Вы оборачиваете список getresults другой функцией, возвращающей список этих оболочек, и вы получаете что-то очень общее. В затмении даже автозаполнение универсального дает вам правильный объект.

...