2012-02-22 2 views
2

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

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

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

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

public void selectAllComponents(ValueChangeEvent event) { 
    selectAll = !selectAll; 
    changeMap(selectedComponentIds, selectAll); 
    FacesContext.getCurrentInstance().renderResponse(); 
} 
0

Я реализовал это с флажком в заголовке фаске DataTable, но с простым JQuery, который выбирает все галочки в этих таблицах строках.

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

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

Смежные вопросы