无法同时定义事件并在此事件上绑定<a4j:support> </a4j:support>

时间:2010-10-06 08:37:51

标签: jsf richfaces ajax4jsf

让我们考虑一下这个简单的代码:

<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的{​​{1}}事件中添加了一些内容:

<h:inputText>

这将生成以下HTML代码:

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

如您所见,Ajax代码不再添加了。就我而言,这是一个非常奇怪的行为。如果事件已在输入字段中定义,为什么<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="alert('foobar');" /> 不附加Ajax调用?

所以我的问题是如何让<a4j:support>处理已在<a4j:support>中定义的event?当然,该解决方案必须运行在input Ajax调用中定义的Javascript代码。

换句话说,我想拥有以下HTML:

onchange

我正在使用Richfaces 3.3.2和JSF 1.2


修改

当然,我可以在<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="alert('foobar'); A4J.AJAX.Submit(...)" /> 的{​​{1}}属性中移动onchange Javascript代码,执行类似的操作:

onsubmit

但这是唯一的方法吗?

3 个答案:

答案 0 :(得分:1)

如果没有明确记录此行为,我会将此视为Ajax4jsf中的错误。在JBoss.org上向Ajax4jsf / RichFaces的人报告。在<a4j:commandButton onclick="someFunction()">

之前我有seen个问题

答案 1 :(得分:1)

之前我已经遇到过这个问题,我发现RichFaces 3.3.x只会执行使用a4j:support定义的onchange事件的代码,并会忽略使用JSF组件定义的onchange代码。

在我的情况下,解决方法很简单,对于我的情况,使用其他事件而不是“onchange”(不确定它是onclick还是onselect)是有效的,所以我将我的代码附加到其他事件并且我的代码工作,但我不确定这是否适合你。如果你真的需要两个元素的onchange事件,你就必须像BalusC所说的那样,并向RichFaces人员报告。

答案 2 :(得分:0)

有关背景的更多信息

事实上,我无法真正修改event的{​​{1}}值,就像Abel Morelos所暗示的那样,因为我要做的是添加一个自定义组件,执行一些客户端验证。此验证调用Javascript函数,因此我的自定义组件会修改其父级的<a4j:support>值。

我的JSF代码如下:

onchange

此代码与以下代码完全等效,只是<h:inputText id="myInput"> <my:validation .../> <a4j:support event="onchange" actionListener="#{myBean.doSomething}"/> </h:inputText> 的{​​{1}}由我的组件自动添加:

onchange

您可以理解,我的自定义组件会直接修改<h:inputText>的{​​{1}}事件,由于<h:inputText id="myInput" onchange="if (!checkSomeValidation()) { return false; }"> <a4j:support event="onchange" actionListener="#{myBean.doSomething}"/> </h:inputText> 的问题,Ajax调用不< / strong>最后绑定到输入组件。


解决方案

当链接到JSF组件时,onchange会将自身“转换”为名称为<h:inputText>的构面,其中<a4j:support><a4j:support>名称。所以在我的情况下,org.ajax4jsf.ajax.SUPPORTxxx将有一个名为xxx的方面。

所以我在我的自定义组件的Java代码中所做的就是检查父(这里是event)是否有这样的方面。

如果,则表示父级没有链接<h:inputText>。因此,在这种情况下,我会修改org.ajax4jsf.ajax.SUPPORTonchange

<h:inputText>属性

如果,则表示有一个<a4j:support event="onchange"/>链接到父级。所以我使用以下代码修改了facet:

onchange