2016-07-18 3 views
0

Я работаю с Primefaces 5.3.Прайсы p: selectOneMenu или p: selectBooleanCheckbox не запускает change-event в зависимости от того, использую ли я h: form

Во-первых, я реализовал функциональность, чтобы изменить видимость ар: selectOneMenu в зависимости от значения ар: selectBooleanCheckbox согласно этому сообщению:

Enabling and disabling components via select checkbox

Это работает до сих пор, если я использую час: формы ,

Далее я хотел обновить значения в компоненте, выбранном в p: selectOneMenu. Здесь начинается мой вопрос: даже если я использую p: ajax для явного вызова слушателя, он не будет вызван. Это мой код:

<h:panelGrid> 
      <p:selectOneMenu value="#{schedulerCDIBean.selectedParentTask}" var="parentTask" id="taskDependence" disabled="#{task.dependsOn != 'true'}"> 

       <p:ajax event="change" listener="#{schedulerCDIBean.taskToAddListener}"/> 

       <f:selectItems id="taskDependenceItems" value="#{schedulerCDIBean.taskWebDataObjectList}" var="item" itemLabel="#{item.taskName}" 
       itemValue="#{item}" /> 

       <p:column> 
        <h:outputText value="#{parentTask}"/> 
       </p:column> 

    </p:selectOneMenu> 
</h:panelGrid> 

А вот как включить/отключить selectOneMenu:

<p:selectBooleanCheckbox id="dependsOnTask" value="#{task.dependsOn}" itemLabel="Depends On">  
     <p:ajax update="taskDependence" process="@this"/> 
</p:selectBooleanCheckbox> 

Все это живет внутри ар: вкладку р: accordionPanel где «задача» является вар из мой DataObject-List.

Как отметил @BalusC в этом посте: commandLink/commandButton/ajax backing bean action/listener method not invoked (Возможные причины: 2),

"Вы не можете вкладывать несколько компонентов UIForm друг в друге."

Итак, если я удалю директиву h: form, вызов слушателя в компоненте будет работать. Но теперь значение p: selectBooleanCheckbox всегда установлено на «false», и, таким образом, компонент не обновляется до видимого.

Я нашел сообщение here, где OP имел ту же проблему и решил его, добавив директиву h: form.

EDIT: Мой «форма» является УИ: состав и начинается, как этот <ui:composition template="/templates/pages/mainPage.xhtml">, где mainPage.xhtml содержит ч: голову и включает в себя «header.xhtml» с использованием Ui: включают в себя, и есть ах: форма , Но эта h: форма уже закрыта раньше, поэтому проблему здесь нет.

Ну, я не хочу идти с добавлением формы h: еще раз, поскольку это приводит к неуказанному поведению. Но что я делаю неправильно, если мои значения p: selectBooleanCheckbox установлены неправильно?

Благодарим за помощь!

UPDATE

Проблема была не час: форма, как это на самом деле не было вложено. Теперь я все еще застрял с слушателями для p: selectOneMenu, так как они не вызываются. Я также попытался установить partialSubmit="true" на <p:ajax />, что не привело к решению до сих пор.

+0

У вас есть установщики/добытчики на 'selectedParentTask'? Как выглядит ваш метод слушателя 'taskToAddListener'? Вы пытались использовать 'p: remoteCommand'? – chaeschuechli

+0

@chaeschuechli Да, у меня есть геттер/сеттер, а подпись слушателя выглядит так: 'public void taskToAddListener (событие AjaxBehaviorEvent)'. Но проблема связана с p: selectBooleanCheckbox (task.dependsOn), где значение всегда установлено на «false». Это не с выделеннойParentTask, так как я избавился от формы h:. Я просто попытался следующий подход с р: remoteCommand '<р: remoteCommand ID = "ет" ActionListener = "# {schedulerCDIBean.taskToAddListener}"/> \t \t \t \t \t <е: Аякс событие = "изменение" OnEvent =» rm "/>', который тоже не работает. Спасибо за вашу помощь – danny

+0

В вашем теге inner selectBooleanCheckbox вы должны вызвать метод прослушивателя, который обновляет логическое значение. – chaeschuechli

ответ

1

Спасибо за помощь, ребята. С вашей помощью я исправил проблему.

Подобно тому, как если бы кто-то еще испытывают подобные проблемы, вот несколько вещей, чтобы проверить:

  1. Check @ ответ BalusC в here, а также упоминаются в @ irieill отвечает.
  2. Проверьте, есть ли у вас equals() и hashCode() объекта, который вы хотите показать в selectOneMenu.

решение для моей ситуации на самом деле было упомянуто в @ irieill свой комментарий:

[..] Не обеспечение надлежащего преобразователя не вызывает каких-либо исключений, но сталкивается с сообщениями об ошибках. Поэтому попробуйте добавить на свою страницу <p:growl autoUpdate="true" />, чтобы узнать, не вызвана ли какая-либо ошибка конверсии. Если это так, добавьте конвертер propper к вашему selectOneMenu.

Я думаю, что это то, что @BalusC сказал в пункте 3 своего списка возможных причин.

Смотрите также: How to write a custom converter for <p:pickList>, Custom converter in JSF 2.0, PrimeFaces ShowCase: SelectOneMenu

0

Как отметил @BalusC в этом посте: commandLink/commandButton/ajax backing bean action/listener method not invoked

Также обратите внимание на точку 1. Вы должны вложить свои входные компоненты с <h:form /> тега.

Ну, я не хочу идти с добавлением формы h: еще раз, поскольку это приводит к неуказанному поведению.

Как я понимаю, вы неправильно используете тег или не понимаете, как его использовать. Просто приложите всю свою страницу (или, по крайней мере, все компоненты ввода) одним тегом <h:form />, и она должна работать.

Не могли бы вы обновить свой вопрос кодом страницы, который также содержит строки, в которых вы разместили теги (0) <h:form />.

+0

Я отредактировал мой вопрос. Надеюсь, это достаточно ясно. – danny

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