Не удается определить событие и одновременно связать <a4j: support /> с этим событием - PullRequest
0 голосов
/ 06 октября 2010

Давайте рассмотрим этот простой код:

<h:form id="myForm">
    <h:inputText id="myInput">
        <a4j:support event="onchange" actionListener="#{myBean.doSomething}"/>
    </h:inputText>
</h:form>

это сгенерирует следующий HTML-код:

<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="A4J.AJAX.Submit(...)" />

Теперь я просто добавляю что-то в onchange событие моего <h:inputText>:

<h:form id="myForm">
    <h:inputText id="myInput" onchange="alert('foobar');">
        <a4j:support event="onchange" actionListener="#{myBean.doSomething}"/>
    </h:inputText>
</h:form>

Будет сгенерирован следующий HTML-код:

<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="alert('foobar');" />

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

Итак, мой вопрос: как заставить <a4j:support> работать на event, который уже определен в input? Конечно, решение должно запускать код Javascript, определенный в onchange и вызов Ajax.

Другими словами, я хотел бы иметь следующий HTML:

<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="alert('foobar'); A4J.AJAX.Submit(...)" />
<Ч />

Я использую Richfaces 3.3.2 и JSF 1.2

<Ч />

EDIT

Конечно, я могу переместить onchange код Javascript в атрибут onsubmit <a4j:support>, делая что-то вроде этого:

<h:inputText id="myInput">
    <a4j:support onsubmit="alert('foobar');" event="onchange" actionListener="#{myBean.doSomething}"/>
</h:inputText>

Но разве это единственный путь?

Ответы [ 3 ]

1 голос
/ 06 октября 2010

У меня уже была эта проблема раньше, и я обнаружил, что RichFaces 3.3.x будет выполнять только код для события onchange, определенного с помощью a4j: support, и будет игнорировать код onchange, определенный с помощью компонента JSF.

В моем случае обходной путь был простым, для моего случая было допустимо использовать другое событие вместо «onchange» (не уверен, было ли это onclick или onselect), поэтому я прикрепил свой код к этому другому событию имой код работал, но я не уверен, что это может сработать для вас.Если вам действительно нужно событие onchange для обоих элементов, вам нужно будет сделать то же, что сказал BalusC, и сообщить об этом людям RichFaces.

1 голос
/ 06 октября 2010

Если это поведение явно не задокументировано, я бы посчитал это ошибкой в ​​Ajax4jsf.Сообщите об этом ребятам из Ajax4jsf / RichFaces там, на JBoss.org.Я видел такие проблемы раньше с <a4j:commandButton onclick="someFunction()">

0 голосов
/ 07 октября 2010

Подробнее о контексте

На самом деле, я не могу действительно изменить event значение <a4j:support>, как рекомендует Абель Морелос , потому что я пытаюсь сделать так, чтобы добавить пользовательский компонент, который выполняет некоторая проверка на стороне клиента. Эта проверка вызывает функцию Javascript, поэтому мой пользовательский компонент изменяет значение onchange его родителя.

Мой код JSF будет выглядеть так:

<h:inputText id="myInput">
    <my:validation .../>
    <a4j:support event="onchange" actionListener="#{myBean.doSomething}"/>
</h:inputText>

Этот код вполне эквивалентен следующему коду, за исключением того, что onchange из <h:inputText> автоматически добавляется моим компонентом:

<h:inputText id="myInput" onchange="if (!checkSomeValidation()) { return false; }">
    <a4j:support event="onchange" actionListener="#{myBean.doSomething}"/>
</h:inputText>

Итак, как вы можете понять, мой пользовательский компонент напрямую изменяет событие onchange <h:inputText>, и из-за проблемы с <a4j:support> вызов Ajax не связан с входом компонент в конце.

<Ч />

Решение

При связывании с JSF-компонентом <a4j:support> преобразуется в фасет, имя которого org.ajax4jsf.ajax.SUPPORTxxx, где xxx - имя event. Так что в моем случае <h:inputText> будет иметь фасет с именем org.ajax4jsf.ajax.SUPPORTonchange.

Итак, что я делаю в своем Java-коде моего пользовательского компонента, это проверяет, имеет ли родительский элемент (<h:inputText> здесь) такой аспект.

Если нет , это означает, что с родителем не связано <a4j:support event="onchange"/>. Поэтому в этом случае я изменяю атрибут onchange моего <h:inputText/>

Если yes , это означает, что есть <a4j:support event="onchange"/>, связанный с родителем. Поэтому я изменяю сам фасет, используя следующий код:

HtmlAjaxSupport facet = (HtmlAjaxSupport) getParent().getFacet("org.ajax4jsf.ajax.SUPPORTonchange");
if (facet != null) {
    facet.setOnsubmit("my Javascript code goes here");
} else {
    getParent().setOnchange("my Javascript goes here");
}
...