JSF 2 проверить / снять галочку со списка h: selectBooleanCheckbox - PullRequest
0 голосов
/ 04 января 2012

У меня есть цикл с кучей h: selectBooleanCheckboxs внутри пользовательского интерфейса: repeat, и я хочу иметь возможность проверять / снимать их все одним щелчком мыши. После this вот как я пытаюсь это сделать:

<h:selectBooleanCheckbox value="#{bean.selectAll}" valueChangeListener="#{bean.selectAllCustomers}">
    <f:ajax execute="@form" render="entireLoop"/>
</h:selectBooleanCheckbox>

Цикл:

<h:panelGroup id="entireLoop">  
  <ui:repeat var="customer" varStatus="status" value="#{bean.customers}">

    <tr> 
        <td>
    <h:selectBooleanCheckbox value="#{bean.customersMap[customer]}"/>
        </td>
      <td><h:commandLink value="#{customer.userID}" action="#{navBean.gotoEditCustomer(customer)}"/></td>
      <td>#{bean.getContact(user)}</td>
      <td>#{customer.companyName}</td>
      <td>#{customer.email}</td>
      <td>#{customer.phone}</td>
    </tr>       
  </ui:repeat>  
</h:panelGroup>

Код в бобе:

public void selectAllCustomers() {
    Iterator<User> keys = customersMap.keySet().iterator();
    while(keys.hasNext()) {
        User user = keys.next();
        customersMap.put(user, selectAll);
    }
}

Когда я нажимаю флажок «выбрать все», у меня возникают две проблемы:

  1. Ничего не происходит. Только когда я нажимаю на другое место на странице, метод вызывается. Как я могу заставить его идти напрямую?

  2. Весь цикл исчезает со страницы. Зачем? (Я попытался заставить ajax отображать только selectBooleanCheckbox, указав ему идентификатор или имя, но я получаю сообщение об ошибке, в котором говорится, что это не компонент именования.)

1 Ответ

1 голос
/ 04 января 2012

Вместо использования valueChangeListener ваш метод будет работать, если вы используете атрибут listener тега <f:ajax>.Это было бы что-то вроде этого:

<h:selectBooleanCheckbox value="#{bean.selectAll}">
    <f:ajax listener="#{bean.selectAllCustomers}" render="entireLoop"/>
</h:selectBooleanCheckbox>

Кроме того, вам не нужно отправлять всю форму с execute="@form".Вам нужно только передать свойство selectAll и повторно отобразить entireLoop.

Если вы действительно хотите использовать valueChangeListener, вы должны заметить, что ваш метод будет запущен до того, как новое значение будет примененоselectAll свойство.В результате ваш entireLoop не будет обновлен до следующего запроса.Чтобы использовать valueChangeListener, ваш метод слушателя должен выглядеть следующим образом:

public void selectAllCustomers(ValueChangeEvent e) {
    boolean newSelectAll = (Boolean) e.getNewValue();
    Iterator<Users> keys = customersMap.keySet().iterator();
    while(keys.hasNext()) {
        Users user = keys.next();
        customersMap.put(user, newSelectAll);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...