Рендеринг богатых интерфейсов Ajax (условный): как это сделать?

#ajax #jsf #richfaces

#ajax #jsf #богатые интерфейсы

Вопрос:

Пожалуйста, посмотрите на следующий фрагмент кода:

 <h:form>
    <h:panelGrid columns="2">
        <h:inputText value="#{vehicleBean.pin}" />
        <a4j:commandButton action="#{vehicleBean.loadVehiclesByPin}" render="results"/>
    </h:panelGrid>
</h:form>
<a4j:outputPanel id="results">
    <rich:dataTable value="#{vehicleBean.vehicles}" rendered="#{not empty vehicleBean.vehicles}">
        ...
    </rich:dataTable>
</a4j:outputPanel>
  

Когда я нажимаю кнопку, отправляется Ajax-запрос для загрузки некоторых бизнес-объектов.
Они отображаются в rich:DataTable, который отображается только в том случае, если соответствующий массив не пуст.

У меня это работает в Chrome и Firefox 4, но не в IE9. Но я почти уверен, что это моя вина, а не IE 😉

Итак, пожалуйста, скажите мне:

  • Каков правильный подход к решению такого рода проблем (с условно отображаемым элементом)?
  • Какой элемент (ы) мне следует рендерить повторно?
  • У CommandButton также есть атрибут execute: когда и почему я должен использовать этот атрибут?

Приветствую Себи

Ответ №1:

RichFaces 3.x не поддерживает IE9, обратитесь к этому сообщению: http://community.jboss.org/thread/156720

Вы можете перейти на RF 4 или внедрить фильтр, чтобы заставить IE9 работать в режиме совместимости:

 public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
    HttpServletResponse resp = (HttpServletResponse) response;
    resp.addHeader("X-UA-Compatible", "IE=EmulateIE8");
    chain.doFilter(request, resp);
}
  

Ответ №2:

некоторые вещи, которые вы могли бы исправить:

  1. пусть ваш тег form окружает все компоненты JSF
  2. если loadVehiclesByPin зависит от значения pin, вы должны выполнить компонент inputText (присвоить ему идентификатор, например, «inputPin») с помощью командной кнопки, подобной этой: execute=»@this inputPin«
  3. я не уверен, правильно ли вы используете в in render=»результат» (помните о концепции NamespaceContainer, прочитайте javadoc UIComponent.FindComponent )

для лучшей отладки я предлагаю включить PROJECT_STAGE=Разработка в web.xml и для открытия консоли javascript вашего браузера.

Имейте в виду, что при использовании условного рендеринга вам нужно указать свой параметр рендеринга на идентификатор в вашем дереве компонентов JSF, который уже есть (вы сделали прямо здесь, окружив свою условную таблицу данных панелью)

с уважением