a4j: поддержка в rich: modalPanel

Я врезался в стену. Я хорошо знаю теги a4j и rich (использую Seam 2.2.0 и Richfaces 3.3.1). Однако я пытаюсь сделать что-то довольно простое, но в богатой: modalPanel.

Похоже, что rich: modalPanels не позволяет запускать события Ajax. Вот простая разбивка: у меня есть h: selectOneMenu с некоторыми элементами в нем и значение которого прикреплено к поддерживающему bean-компоненту. К этому h: selectOneMenu прикреплен тег a4j: support, поэтому всякий раз, когда запускается событие изменения, компонент поддержки должен обновляться. Действительно простые вещи, а?

Однако, когда этот h: selectOneMenu находится в rich: modalPanel, событие onchange не обновляет компонент поддержки до закрытия rich: modalPanel.

Я могу подтвердить это, потому что я запускаю его в режиме отладки Eclipse, и у меня есть точка останова на установщике свойства, подключенного к h: selectOneMenu. Это сводит меня с ума! Это обычная штука для Ajax, но rich: modalPanels, похоже, не позволяет этого.

Итак, вопрос: могу ли я делать Ajax-вещи в rich: modalPanel? Я в основном пытаюсь использовать rich: modalPanel как форму (я пробовал a4j: form и h: form безрезультатно), которая реагирует на изменения в раскрывающемся списке (например, когда пользователь меняет раскрывающийся список, определенный часть формы должна быть перерисована). Я пытаюсь сделать что-то, что невозможно?

Вот упрощенная версия modalPanel:

<rich:modalPanel id="quickAddPanel">
    <div>
        <a4j:form id="quickAddPaymentForm" ajaxSubmit="true">
                <s:decorate id="paymentTypeDecorator">
                    <a4j:region>
                        <h:selectOneMenu
                            id="paymentType"
                            required="true"
                            value="#{backingBean.paymentType}"
                            tabindex="1">
                            <s:selectItems 
                                label="#{type.description}"
                                noSelectionLabel="Please select..."
                                value="#{incomingPaymentTypes}"
                                var="type"/>
                            <s:convertEnum/>
                            <a4j:support 
                                ajaxSingle="true" 
                                event="onchange"
                                eventsQueue="paymentQueue"
                                immediate="true"
                                limitToList="true"
                                reRender="paymentTypeDecorator, paymentDetailsOutputPanel, quickAddPaymentForm"/>
                        </h:selectOneMenu>
                    </a4j:region>
                </s:decorate>
            </fieldset>

            <fieldset class="standard-form">
                <div class="form-title">Payment details</div>
                <a4j:outputPanel id="paymentDetailsOutputPanel">
                    <h:outputText value="This should change whenever dropdown changes: #{backingBean.paymentType}"/>
                </a4j:outputPanel>
            </fieldset>
        </a4j:form>
    </div>
</rich:modalPanel>

С уважением, Энди


person Andy Deighton    schedule 11.01.2011    source источник
comment
вызывает ли какое-либо действие событие a4j: support onchange? если да, то подтвердили ли вы, что действие вызывается?   -  person niksvp    schedule 11.01.2011
comment
Нет. Это простая привязка a4j: support event = 'onchange', которая гарантирует, что при изменении раскрывающегося списка значение компонента поддержки, к которому он привязан, будет обновлено. И он обновляется, но только после закрытия модальной панели. Если бы его не было на модальной панели, обновление bean-компонента происходило бы каждый раз при изменении значения раскрывающегося списка.   -  person Andy Deighton    schedule 11.01.2011
comment
Модалпанель с формой (h или a4j) внутри должна работать. Ах да, и не забудьте его перерендерить. Отредактируйте и опубликуйте свой модальный код, чтобы мы могли помочь вам лучше.   -  person Renan    schedule 11.01.2011
comment
Хорошо, я добавил упрощенную версию modalPanel. То, что должно произойти, но не значение h: outputText = Это должно меняться каждый раз ....   -  person Andy Deighton    schedule 11.01.2011


Ответы (4)


используйте 1_

и удалите следующие атрибуты из: ajaxSingle = "true", inventory = "true"

person TaherT    schedule 17.01.2011

Он должен работать. Проверьте с помощью a4j: log, что обновленная разметка (которую вы повторно визуализируете) отправляется с сервера. Я не верю, что это вызывает проблему, но вы можете изменить несколько вещей в своем коде:

ajaxSubmit = true - вам это действительно не нужно, поскольку вы используете a4j: support ajaxSingle = true и a4j: region - то же самое в вашем случае limitToList = true - вам это не нужно, поскольку вы не обновляете другие области на странице.

person Max Katz    schedule 11.01.2011
comment
Починил это! Из тега h: selectOneMenu a4j: support удален limitList, немедленный и ajaxSingle, и вуаля, мои представления ajax работают! Спасибо за внимание! Очень признателен. - person Andy Deighton; 13.01.2011

Попробуйте принять форму за пределами вашего тега modalPanel:

<a4j:form id="quickAddPaymentForm" ajaxSubmit="true">
    <rich:modalPanel id="quickAddPanel">
        <div>

также убедитесь, что ваш quickAddPaymentForm не вложен

person arthurgrig    schedule 12.01.2011

Проверьте параметры HTML, созданные f: selectItems или s: selectItems, не содержат конечных пробелов (просмотреть исходный код страницы из браузера):

<select>
  <option value="0    ">Select One    </option>
  <option value="id1    ">Choice 1    </option>
  <option value="id2    ">Choice 2    </option>
  <option value="id3    ">Choice 3    </option>
</select>

Если это так, удалите конечные пробелы в коде на стороне сервера,

<select>
  <option value="0">Select One</option>
  <option value="id1">Choice 1</option>
  <option value="id2">Choice 2</option>
  <option value="id3">Choice 3</option>
</select>

Я обнаружил, что конечные пробелы препятствуют срабатыванию события Ajax, когда a4j: support и h: selectOneMenu работают внутри rich: modalPanel, хотя он отлично работает вне rich: modalPanel. Вот рабочий пример кода:

<h:form>
<rich:modalPanel id="myPanel" autosized="true" width="700" showWhenRendered="true">
  <table cellpadding="4" cellspacing="2" align="center" width="100%">
  <tr>
    <td align="left">
      <h:selectOneMenu styleClass="dropdown" id="dropdownList"
          value="#{backbean.currentChoice}"
          valueChangeListener="#{backbean.choiceChanged}" >
          <f:selectItems value="#{backbean.choiceItems}"></f:selectItems>
          <a4j:support event="onchange" reRender="whatPicked" ajaxSingle="true" />
          </h:selectOneMenu>
      </td>
    </tr>
    <tr>
      <td>
        <a4j:outputPanel id="whatPicked"> 
          <h:outputText value="#{backbean.currentChoice }"></h:outputText>
        </a4j:outputPanel>
      </td>
    </tr>
  </table>
</rich:modalPanel>
</h:form>
person Jonathan L    schedule 11.09.2013