Рендеринг Ajax не работает с SelectBooleanCheckbox

У меня есть форма JSF, на которой у меня есть selectBooleanCheckbox. Если значение флажка истинно, я хочу отобразить поле со списком рядом с ним. Но почему-то не работает.

Вот мой код:

      <h:outputText value="Condition"/>
      <h:selectBooleanCheckbox id="provisioningTargetCollector" 
                           value="#{targetSource.provisioningTargetCollector}"
                           disabled="#{!sp:hasRight(facesContext, 'ManageApplication')}"
                           readonly="#{!sp:hasRight(facesContext, 'ManageApplication')}">
                           <f:ajax  render="targetCollectorsGroup" />
                           </h:selectBooleanCheckbox>

      <h:outputText value="Provisioning Target Collector"/>
      <h:panelGroup id="targetCollectorsGroup">
        <a4j:outputPanel id="targetCollectors">
          <h:selectOneMenu id="collector"
                           value="#{targetSource.selectedTargetCollector}"
                           rendered="#{empty targetSource.object.id}"
                           disabled="#{!sp:hasRight(facesContext, 'ManageApplication')}"
                           readonly="#{!sp:hasRight(facesContext, 'ManageApplication')}">
            <f:selectItem itemValue="" itemLabel="#{msgs.select_provisioning_target_collector}"/>
            <f:selectItems value="#{targetSource.targetCollectors}"/>
          </h:selectOneMenu>
          <h:selectOneMenu id="fixedTargetCollector" value="#{empty targetSource.selectedTargetCollector ? 'None' : targetSource.selectedTargetCollector}"
                           rendered="#{not empty targetSource.object.id}"
                           disabled="true"
                           readonly="true">
            <f:selectItem itemValue="#{empty targetSource.selectedTargetCollector ? 'None' : targetSource.selectedTargetCollector}"
                          itemLabel="#{empty targetSource.selectedTargetCollector ? msgs.none : targetSource.selectedTargetCollector}"/>
          </h:selectOneMenu>
        </a4j:outputPanel>
      </h:panelGroup>

Методы класса бина:

private boolean _provisioningTargetCollector;

public boolean isProvisioningTargetCollector() {

    return _provisioningTargetCollector;
 }

 public void setProvisioningTargetCollector(boolean provisioningTargetCollector) {

     _provisioningTargetCollector = provisioningTargetCollector;
 }

Примечание: скопировано из FireBug.

Это POST-запрос:

AJAX:EVENTS_COUNT   1
editForm    editForm
editForm:collector  
editForm:collectorType  
editForm:dsCorrelationRul...    
editForm:dsCreationRule 
editForm:dsDescription  
editForm:dsName 
editForm:id 2c90950048166abc0148177755040025
editForm:selectedTargetsF...    
editForm:type   Active Directory - Direct
javax.faces.ViewState   1920301575480395177:8510885827764100150
javax.faces.behavior.even...    click
javax.faces.partial.ajax    true
javax.faces.partial.event   click
javax.faces.partial.execu...    editForm:provisioningTargetCollector editForm:provisioningTargetCollector
javax.faces.partial.rende...    editForm:targetCollectorsGroup
javax.faces.source  editForm:provisioningTargetCollector
rfExt   null

Ответ:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><changes><update id="editForm:targetCollectorsGroup"><![CDATA[<span id="editForm:targetCollectorsGroup"><span id="editForm:targetCollectors"><select id="editForm:collector" name="editForm:collector" size="1">  <option value="">Select a Provisioning Target Collector ...</option>
    <option value="AD Test">AD Test</option>
    <option value="ADWindow">ADWindow</option>
    <option value="ADTestSth">ADTestSth</option>
</select></span></span>]]></update><update id="javax.faces.ViewState"><![CDATA[1920301575480395177:8510885827764100150]]></update><extension id="org.richfaces.extension"><render>editForm:targetCollectorsGroup</render></extension></changes></partial-response>

person code_fish    schedule 28.08.2014    source источник
comment
Вы можете попробовать после добавления execute="@this" к f:ajax?   -  person tt_emrah    schedule 28.08.2014
comment
@tt_emrah Я пытался. До сих пор не работает.   -  person code_fish    schedule 28.08.2014
comment
Попробуйте заменить <f:ajax render="targetCollectorsGroup" /> на <a4j:ajax event="click" render="targetCollectorsGroup" />. Не связано: вам действительно нужно <h:panelGroup id="targetCollectorsGroup">? Для рендеринга вы можете использовать targetCollectors.   -  person Vasil Lukach    schedule 29.08.2014
comment
@VasilLukach Все еще не работает после перехода на a4j. Да я тоже так могу.   -  person code_fish    schedule 29.08.2014
comment
Ваш код шумный. Рассмотрите возможность удаления всех ненужных тегов/атрибутов/стилей/и т. д. с вашей точки зрения, которые не влияют на рассматриваемую проблему. На первый взгляд я бы сказал, что ваш код и описание несовместимы: вы хотите полагаться на логическое значение, установленное с помощью флажка, но позже отображать поля со списком на основе наличия идентификатора объекта. Почему?   -  person skuntsel    schedule 29.08.2014
comment
Этот код уже присутствует в таком виде. Рендеринг в поле со списком должен показывать его только во время настройки. После сохранения форма не появится. Мне нужно просто показать/скрыть поле со списком при нажатии флажка. Могу ли я сделать это, используя javascript вместо использования ajax? Думаю сделать так.   -  person code_fish    schedule 29.08.2014
comment
@skuntsel Спасибо, приятель!! Теперь он работает как шарм. Большое спасибо за руководство.   -  person code_fish    schedule 29.08.2014


Ответы (1)


Простой способ добиться желаемой функциональности — буквально перерисовать поле со списком на основе выбора флажка. Делается это следующим образом:

<h:selectBooleanCheckbox binding="#{checkbox}">
    <f:ajax render="group" />
</h:selectBooleanCheckbox>
<h:panelGroup id="group">
    <h:selectOneMenu ... rendered="#{checkbox.value}" />
</h:panelGroup>

Обратите внимание, что коду не нужны никакие специальные поля в bean-компоненте, а UIComponent привязан к представлению.

Конечно, вы можете сделать это и с помощью свойства bean-компонента, если вам это нужно в вашей модели:

<h:selectBooleanCheckbox value="#{bean.value}">
    <f:ajax render="group" />
</h:selectBooleanCheckbox>
<h:panelGroup id="group">
    <h:selectOneMenu ... rendered="#{bean.value}" />
</h:panelGroup>

Также стоит отметить, что эта функциональность может быть достигнута и с помощью простого JavaScript, путем переключения атрибута display элемента между none и block. Но имейте в виду, что вы должны поддерживать одинаковый статус компонентов JSF для всех обратных передач, чтобы защититься от возможных вредоносных атак.

person skuntsel    schedule 29.08.2014