JSF2.0 с <f: ajax> работает только один раз - PullRequest
4 голосов
/ 15 февраля 2011

У меня проблема с тегом в JSF2.0, и я надеюсь, что кто-то может указать, что я делаю неправильно. Вот что у меня в интерфейсе:

<h:panelGroup>
  <h:form id="theForm">
    <h:selectOneMenu id="theMenu" value="#{viewBean.selectedItem}">
        <f:ajax event="change" render="selectedItemText"/>
    <f:selectItem itemLabel=""/>
    <f:selectItems value="#{viewBean.selectableItems}"/>
    </h:selectOneMenu>
    <h:outputText id="selectedItemText" value="#{viewBean.selectedItemText}" />
  </h:form>
</h:panelGroup>

Это прекрасно работает - у моего бина-контекста в области беседы есть метод setSelectedItem, и он вызывается и работает, когда я выбираю другой элемент в меню в первый раз; выходной текст обновляется во внешнем интерфейсе, и я счастлив. Однако дальнейшие изменения в выборе меню не вызывают вызов к сеттеру через ajax. Я также попробовал это с прослушивателем на теге f:ajax - метод прослушивателя вызывается только в первый раз (точки останова в коде, чтобы понять это).

Я что-то делаю неправильно?

Ответы [ 4 ]

4 голосов
/ 22 марта 2013

У меня была похожая проблема.

Моя вторая команда command ниже работает только один раз в представлении JSF ниже, которое имеет параметр view. Добавление <f:param> к моей первой команде кнопка решило проблему. Это ситуация, не охваченная очень полезной дискуссией BalusC .

<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">

<f:view>
    <f:metadata>
        <f:viewParam name="id" value="#{fooManager.millis}" required="true"/>
    </f:metadata>

    <h:head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    </h:head>

    <h:body>
        <h:form id="fooForm">
            <h:commandButton
                    id="barBbutton"
                    value="foo:test"
                    action="#{fooManager.test}">
                <f:param name="id" value="1"/>
                <f:ajax render="fooMillis1"/>
            </h:commandButton>

            <p>
                <h:outputText id="fooMillis1" value="foo:display1: #{fooManager.millis}"/>
            </p>
            <p>
                <h:outputText id="fooMillis2" value="foo:display2: #{fooManager.millis}"/>
            </p>
        </h:form>
        <h:form id="barForm">
            <h:commandButton
                    id="barButton"
                    value="bar:test"
                    action="#{barManager.test}">
                <f:ajax render="barMillis1"/>
            </h:commandButton>

            <p>
                <h:outputText id="barMillis1" value="bar:display1: #{barManager.millis}"/>
            </p>
            <p>
                <h:outputText id="barMillis2" value="bar:display2: #{barManager.millis}"/>
            </p>
        </h:form>
    </h:body>
</f:view>
</html>

И мои FooManager и BarManager выглядят одинаково:

@ManagedBean
@ViewScoped
public class FooManager {

    public long getMillis() {
        return millis;
    }

    public void setMillis(long millis) {
        this.millis = millis;
    }

    public void test() {
        setMillis(System.currentTimeMillis());
    }
    private long millis;

}

Когда она не работает, моя библиотека Weblogic / Mojarra не дает никаких полезных советов. Там нет ошибки нигде. Лишь после многочисленных попыток у меня появилась рабочая кнопка, подобная первой, приведенной выше.

3 голосов
/ 02 ноября 2012

У меня была такая же проблема.Для кода ниже ajax запускался только один раз.

<h:inputText id="element_id" value="#{viewBean.someValue}"></h:inputText>   
<h:commandLink action="#{viewBean.someAction}" value="click me">
     <f:ajax render=":my_form:another_element" execute="element_id> </f:ajax>
</h:commandLink>

Когда я добавляю к атрибуту рендеринга элемент, который я выполняю, тогда ajax запускается каждый раз.

<h:inputText id="element_id" value="#{viewBean.someValue}"></h:inputText>   
<h:commandLink action="#{viewBean.someAction}" value="click me">
     <f:ajax render=":my_form:another_element element_id" execute="element_id> </f:ajax>
</h:commandLink>
1 голос
/ 20 июля 2012

У меня была похожая проблема, в моем случае everithing отлично работал во всех браузерах, за исключением того, что в IE9 ajax запускался только один раз., это работало нормально.Я не знаю, почему, поскольку у меня есть только одна Форма на этой странице, и все мои компоненты находятся в этой форме.

Поэтому я бы посоветовал вам проверить теги render и execute, по крайней мере, в моемесли это было решение

0 голосов
/ 01 июля 2016

У меня была та же ошибка, исправил ее, используя Primeface's p:ajax вместо f:ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...