valueChangeListener никогда не вызывается - PullRequest
2 голосов
/ 21 ноября 2011

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

 <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>

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

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

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

Ответы [ 2 ]

11 голосов
/ 21 ноября 2011

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

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

    Заменить

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

    на

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

    Заменить

    public void PermissionChanged(ValueChangeEvent event) {
    

    на

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

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

0 голосов
/ 21 ноября 2011

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

"#{userTypeController.permissionChanged}" 

Чтение здесь .

...