valueChangeListener никогда не вызывался

У меня есть следующие биты кода:

 <h:panelGroup rendered="#{userTypeController.permissionItemsUserType.contains(item)}">
                    <h:selectBooleanCheckbox valueChangeListener="#{userTypeController.permissionChanged(this)}" value="#{true}"/> 
                    <h:outputText value="#{item.getAction()}" />
                </h:panelGroup>
                <h:panelGroup rendered="#{!userTypeController.permissionItemsUserType.contains(item)}">
                    <h:selectBooleanCheckbox value="#{false}"/> 
                    <h:outputText value="#{item.getAction()}" />
                </h:panelGroup>

Но по какой-то причине метод permissionChanged никогда не вызывается. Любые идеи о том, что может пойти не так?

Мой метод разрешения изменен:

    public void PermissionChanged(ValueChangeEvent event) {
    System.out.println("test");
}

person ThomasVdBerge    schedule 21.11.2011    source источник


Ответы (2)


Есть три проблемы:

  1. Ваш вызов метода слушателя в EL неверен. Не следует передавать текущий компонент по нему.

    Заменять

    valueChangeListener="#{userTypeController.permissionChanged(this)}"
    

    by

    valueChangeListener="#{userTypeController.permissionChanged}"
    
  2. Подпись вашего метода в поддерживающем bean-компоненте неверна. Он должен соответствовать соглашениям об именах Java.

    Заменять

    public void PermissionChanged(ValueChangeEvent event) {
    

    by

    public void permissionChanged(ValueChangeEvent event) {
    
  3. Кажется, вы ожидаете, что он сработает сразу же, как только вы установите флажок (иначе вы бы увидели ELException). Это ожидание не соответствует действительности. Он будет запущен только после отправки формы. Использование onclick="submit()" является распространенным хаком/обходным решением для этого.

Тем не менее, вероятно, есть лучшие способы для этого. Поскольку функциональные требования неясны, невозможно предложить правильное решение. Я думаю, что <f:ajax> - это то, что вам нужно, если все, что вам нужно, это немедленная и асинхронная обратная связь и повторный рендеринг. Хотя в вашем вопросе отсутствует тег JSF 2.0, судя по истории вопросов, вы используете JSF 2.0, поэтому <f:ajax> должно работать на вас.

person BalusC    schedule 21.11.2011

Если вы используете JSF 1.2, вы не можете передать аргумент слушателю. Ты используешь:

"#{userTypeController.permissionChanged}" 

Прочитайте здесь.

person Michel Foucault    schedule 21.11.2011
comment
Передача аргументов метода относится не только к JSF, но и к EL. Если бы OP не использовал EL 2.2 или JBoss EL, он наверняка выдал бы ELException. - person BalusC; 21.11.2011