2013-05-28 5 views
0

У меня есть бэк-компонент, который является ViewScoped. У меня есть ajax включен SelectBooleanCheckbox es в форме. Пример:selectBooleanCheckbox не запускает идентификатор viewstate

<p:selectBooleanCheckbox value="#{formBean.value2}"> 
    <p:ajax update=":theform"/> 
</p:selectBooleanCheckbox> 

Обычно, некоторые скрытые поля ввода должны быть в HTML, чтобы пройти через ViewState ID. Проблема в том, что они не инициируются при первом запросе страницы. Когда я нажимаю один из флажков, форма (и, соответственно, флажки) обновляется. С этого момента идентификатор состояния представления отправляется с этими флажками, поэтому состояние просмотра может быть сохранено.

Самая большая проблема заключается в том, что при первом вызове ajax запускается набор новых компонентов ViewScoped и поэтому я теряю данные о первом действии. С этого момента все работает нормально.

Может ли кто-нибудь дать мне какие-либо указания о том, что может быть проблемой?

Точный код:

 <p:panel header="Schedule" toggleable="true"> 
      <form> 
       <p:outputPanel id="schedule"> 
        <ui:repeat var="scheduleDay" value="#{jobBean.jobScheduleDays}"> 
         <div> 
          <p:selectBooleanCheckbox value="#{scheduleDay.selected}" style="margin:4px"> 
           <p:ajax update=":schedule" /> 
          </p:selectBooleanCheckbox> 
          <h:outputText value="#{scheduleDay.readableDay}" style="text-transform:capitalize"/> 
         </div> 
        </ui:repeat> 
       </p:outputPanel> 
      </form> 
     </p:panel> 
+0

Является ли родительский компонент рассматриваемой формы визуализирован другим запросом ajax заранее? Если это так, то ваша проблема совпадает с пунктом 7 http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not-being-invoked/2120183#2120183 Обратите внимание, что эта конкретная проблема полностью не связана с флажком, у вас была бы такая же проблема при использовании, например, '' вместо этого. – BalusC

+0

Нет, это не тот случай. Я добавил свой код в начальный пост. Исправление, на которое вы указывали, не помогает мне сразу. Я не могу найти, как установить атрибут render (я думаю, что он недоступен?). – ChristopherS

+1

Таким образом, вы используете простой HTML '

' вместо JSF '', что противоречит точке 1 этого списка? – BalusC

ответ

3

Ваша проблема вызвана использованием простой HTML <form> вместо JSF <h:form>. <h:form> не только сгенерирует правильный HTML-код <form> с правильным набором методов и действий, но также позаботится о создании двух дополнительных скрытых полей, определяющих отправленную форму и идентификатор состояния представления JSF.

E.g.

<h:form id="foo"> 

генерирует

<form id="foo" name="foo" action="ViewHandler#getActionURL()" method="post"> 
    <input type="hidden" name="foo" value="foo" /> 
    <input type="hidden" name="javax.faces.ViewState" value="..." /> 

(URL, действие формы заполняется с результатом ViewHandler#getActionURL())

То, что обычный HTML <form> работает с запросами JSF AJAX, потому что они не точно используйте элемент формы для отправки запроса HTTP POST, но вместо этого использует объект JavaScript для отправки запроса HTTP POST, параметры которого заполнены путем перемещения входные элементы в родительской форме с использованием JavaScript form.elements. Ответ ajax JSF автоматически обновит скрытое поле состояния представления JSF, поэтому JSF сможет обрабатывать форму отправки со второго запроса и далее.

Однако, используя простой HTML <form>, вы бы не справились с трудностями при использовании запросов, отличных от ajax.

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