Не может определить событие и связывать на этом событии одновременно

StackOverflow https://stackoverflow.com/questions/3870753

  •  28-09-2019
  •  | 
  •  

Вопрос

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

<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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top