Подробнее о контексте
На самом деле, я не могу действительно изменить 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");
}