AJAX-вызов очищает значения в не связанных элементах управления - PullRequest
0 голосов
/ 16 февраля 2010

Я использую 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 ]

1 голос
/ 16 февраля 2010

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

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

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

Приветствия

D

1 голос
/ 16 февраля 2010

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

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

0 голосов
/ 23 февраля 2010

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

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

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

...