Не может определить событие и связывать на этом событии одновременно
Вопрос
Давайте рассмотрим этот простой код:
<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
РЕДАКТИРОВАТЬ
Конечно, я могу переместить onchange
Код JavaScript в onsubmit
атрибут <a4j:support>
, делать что-то в этом роде:
<h:inputText id="myInput">
<a4j:support onsubmit="alert('foobar');" event="onchange" actionListener="#{myBean.doSomething}"/>
</h:inputText>
Но это единственный путь ??
Решение 3
Больше о контексте
На самом деле, я не могу модифицировать 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 Call есть нет привязан с входным компонентом в конце.
Решение
При связи с компонентом 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/>
Если да, это означает, что есть <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");
}
Другие советы
Если это поведение не явно задокументировано, я бы рассмотрел это как ошибку в ajax4jsf. Сообщите об этом в AJAX4JSF / Richfaces, ребята там в jboss.org. У меня есть видимый проблемы, как это раньше с <a4j:commandButton onclick="someFunction()">
У меня уже была эта проблема раньше, и я обнаружил, что Richfaces 3.3.x будет выполнять только код для события Onchange, определенный с помощью A4J: Поддержка, и будет игнорировать код ONChange, определенный компонентом JSF.
В моем случае обходной путь был просты, для моего случая было действительным использовать другое событие вместо «Onchange» (не уверена, если он был onClick или onselect), поэтому я приложил свой код на это другое событие, и мой код работал, но я работал Не уверен, может ли это работать для вас. Если вам действительно нужно событие OnChange для обоих элементов, вам придется делать так же, как BalusC сказал, и сообщил об этом людям Richfaces.