0

Let's consider this simple code:

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

this will generate the following HTML code:

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

Now, I just add something in the onchange event of my <h:inputText>:

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

This will generate the following HTML code:

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

As you can see, the Ajax code is not added anymore. This is a really strange behavior as far as I am concerned. Why the <a4j:support> does not attach the Ajax call if the event is already defined in the input field?

So my question is how to make the <a4j:support> working on an event that is already defined in the input? Of course, the solution must run both the Javascript code defined in onchange and the Ajax call.

In others words, I would like to have the following HTML:

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

I am using Richfaces 3.3.2 and JSF 1.2


EDIT

Of course, I can move the onchange Javascript code in the onsubmit attribute of the <a4j:support>, doing something like that:

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

But is it the only way??

4

3 に答える 3

1

この動作が明示的に文書化されていない場合は、これを Ajax4jsf のバグと見なします。JBoss.org の Ajax4jsf/RichFaces 担当者に報告してください。私は前にそのような問題を見てきました<a4j:commandButton onclick="someFunction()">

于 2010-10-06T15:18:37.327 に答える
1

以前にもこの問題がありましたが、RichFaces 3.3.x は a4j:support で定義された onchange イベントのコードのみを実行し、JSF コンポーネントで定義された onchange コードを無視することがわかりました。

私の場合、回避策は簡単でした.私の場合、「onchange」の代わりに他のイベントを使用することが有効でした(onclickかonselectかはわかりません)ので、コードをこの他のイベントに添付するとコードが機能しましたが、これがうまくいくかどうかはわかりません。両方の要素に onchange イベントが本当に必要な場合は、BalusC が言ったように実行し、RichFaces の人々に報告する必要があります。

于 2010-10-06T17:49:34.967 に答える
0

コンテキストの詳細

実際、私がしようとしているのは、クライアント側の検証を実行するカスタム コンポーネントを追加することであるため、Abel Morelosによって提案されたように、 のevent値を実際に変更することはできません。この検証は Javascript 関数を呼び出すため、カスタム コンポーネントはその親の値を変更します。<a4j:support>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>ここ) にそのようなファセットがあるかどうかを確認することです。

no の場合、親がそれ<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");
}
于 2010-10-07T07:37:00.117 に答える