让我们考虑一下这个简单的代码:
<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
但这是唯一的方法吗?
答案 0 :(得分:1)
如果没有明确记录此行为,我会将此视为Ajax4jsf中的错误。在JBoss.org上向Ajax4jsf / RichFaces的人报告。在<a4j:commandButton onclick="someFunction()">
答案 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