AJAX-вызов очищает значения в не связанных элементах управления

Я использую RichFaces' a4j:support, чтобы переключать видимость некоторых элементов управления на странице. Однако, когда кнопка h:selectOneRadio rdoRequestType изменяется, она очищает значения txtLibraryServerNumber и других элементов управления в a4j:outputPanel с идентификатором "media". Почему один вызов AJAX на странице мешает другой панели AJAX?

Я попытался использовать атрибут "process" в теге a4j: support на selectOneRadio, чтобы он записывал значения текстовых полей на другой панели в bean-компонент Seam, но это не имеет никакого эффекта. Какого черта я делаю не так? Помогите! Я схожу с ума!!

<h:selectOneRadio value="#{webencode.requestType}"
  id="rdoRequestType" styleClass="radio" style="width:295px" layout="pageDirection" >
  <f:selectItem itemValue="program" itemLabel="Series or Individual Program"/>
  <f:selectItem itemValue="promo" itemLabel="Promo" />
  <f:selectItem itemValue="specific" itemLabel="Specific Format Encoding Request"/>
  <a4j:support ajaxSingle="true" event="onclick" reRender="program" process="txtLibraryServerNumber,txtDigitalMediaFileName"/>
</h:selectOneRadio>

<a4j:outputPanel id="program" ajaxRendered="true">
  <s:span rendered="#{('program' == webencode.requestType || 'promo' == webencode.requestType) ? true : false}">
    <h:selectOneMenu value="#{webencode.seriesId}" id="lstSeriesName">
      <f:selectItems value="#{webencode.programItems}"/>
    </h:selectOneMenu>
  </s:span>
  <s:span rendered="#{'specific' == webencode.requestType ? true : false}">
    <h:selectOneMenu value="#{webencode.arrVideoEncodings.get(0).videoEncoding}"
      id="lstSpecificVideoEncoding1" style="width:295px;">
      <f:selectItems value="#{webencode.videoEncodingItems}"/>
    </h:selectOneMenu>
  </s:span>
</a4j:outputPanel>             

<h:selectOneMenu value="#{webencode.inputMediaType}"
  id="lstInputMediaType">
  <f:selectItems value="#{webencode.inputMediaTypeItems}"/>
  <a4j:support ajaxSingle="true" event="onchange" reRender="media" process="lstSeriesName,lstSpecificVideoEncoding1"/>
</h:selectOneMenu>

<a4j:outputPanel id="media" ajaxRendered="true">
  <s:span rendered="#{'Tape Library # or Server ID #' == webencode.inputMediaType ? true : false}">
    <h:inputText id="txtLibraryServerNumber"
      value="#{webencode.libraryServerNumber}" maxlength="50" />
  </s:span>  
  <s:span rendered="#{'Digital Media File Name' == webencode.inputMediaType ? true : false}">
    <h:inputText id="txtDigitalMediaFileName"
      value="#{webencode.digitalMediaFileName}" maxlength="195" /><br />
  </s:span>  
</a4j:outputPanel>

3 ответа

Решение

Нашел решение: очень странно, но на сервере, на котором работает Apache с JBoss, для атрибута limitToList должно быть установлено значение true:

<a4j:support ajaxSingle="true" event="onchange" reRender="media" 
     limitToList="true"/>

Это обеспечивает повторную визуализацию только указанного элемента управления (в данном случае "media"). Все еще не знаю, почему это требуется на сервере, но не на локальном хосте. Должен быть что-то с Apache и как он общается с JBoss, но не уверен.

Какова область применения вашего компонента Webencode? Это должно быть Пейдж или дольше, иначе ваши значения будут потеряны при каждом вызове. Помните, что если вы не укажете область действия, то по умолчанию используется запрос, и каждый вызов Ajax является запросом.

Ваша медиапанель всегда обновляется, так как вы указали ее с помощью атрибута ajaxRendered, который похож на высказывание "даже если меня не просят перерисовать, всегда переопределяйте меня". Если у вас нет веских оснований для использования ajaxRendered (например, что-то, что всегда отображается как сообщения о состоянии), тогда вам лучше начать с подробного определения того, что нужно повторно сделать.

Атрибут процесса здесь не обязателен - избавьтесь от него.

Ура,

D

Если для свойства UpdateMode панели установлено значение "Always", оно будет обновляться при любой обратной передаче. Если вы установите его в "условный", он будет обновляться только тогда, когда один из его собственных триггеров вызовет обратную передачу.

Я не знаю, очистит ли это ваши элементы управления, но это возможный ответ, почему одна панель влияет на другую.

Другие вопросы по тегам