установите флажок Все в JSF без использования Javascript - PullRequest
3 голосов
/ 15 октября 2010

Я пытаюсь установить / снять все флажки в таблице данных, используя один флажок. Поскольку я пытаюсь установить его на сервере, я не могу этого сделать. Я искал решения, но не смог понять, как этого добиться на стороне сервера.

Вот код.

xhtml file ###

<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]}">
         </h:selectBooleanCheckbox>
        </rich:column>

Файл Java

// Select All and delete
 public void selectAllComponents(ValueChangeEvent event){

  // If the check all button is checked, set all the checkboxes as selected 
  if(!selectAll)
  {
   changeMap(selectedComponentIds,true);
   setSelectAll(true);
  }
  else // If the button is unchecked, unselect all the checkboxes
  { 
   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);
  }
 }

Я отмечаю все значения в списке как true, когда флажок установлен, и false, когда снят флажок.

Но страница не перезагружает данные должным образом.

Правильный ли мой метод решения проблемы? Или есть эффективная альтернатива?

Ответы [ 2 ]

7 голосов
/ 15 октября 2010

Это потому, что ValueChangeEvent происходит перед фазой обновления модели, поэтому измененное вами значение перезаписывается.
Сделайте это в public void selectAllComponents(ValueChangeEvent event)

if (event.getPhase() != PhaseId.INVOKE_APPLICATION) {
    event.setPhase(PhaseId.INVOKE_APPLICATON);
    event.queue();
 } else {
    //do your stuff here
 }
1 голос
/ 26 сентября 2011

Или перед тем, как ваш код добавить следующий код строки в исходном методе

selectAll = (Boolean) event.getNewValue ();

...