我有以下按钮:
<a4j:commandButton value="#{AppMessages['general.action.cancel']}"
disabled="#{!entityBB.expandState.editable}"
actionListener="#{entityBB.cancel}"
render="initialServicePanel :messages" status="ajaxStatus"
immediate="true" />
在我的情况下,上面的按钮可以完成我需要的一切(从uiComponent中删除inError状态以重新渲染它并将表单中的所有内容重置(取消)到之前的状态)。
当我尝试使用它时:
<h:commandButton value="#{AppMessages['general.action.cancel']}"
disabled="#{!entityBB.expandState.editable}" immediate="true">
<a4j:ajax execute="@this" render="initialServicePanel :messages"
listener="#{entityBB.cancel}" status="ajaxStatus" />
</h:commandButton>
它不起作用(值被重置,但是uiComponent(inputText)保持红色,但是错误)。为什么是这样?我无法弄清楚他们两个之间的区别,因为我认为a4j:commandButton只是一个h:commandButton,其后面是a4j:ajax。
编辑:现在我还有另一种情况,即h:commandButton
删除了值,但保持错误(红色边框)。并且a4j:commandButton
将其从错误中删除(红色边框)但保留了值。它与上面完全相同的输入。我无法解释它......任何人?
答案 0 :(得分:3)
execute
的{{1}}默认为<a4j:commandButton>
,但@form
的默认值为<a4j:ajax>
,这意味着只有&#34;当前成分&#34;正在执行(因此,按钮本身)。这导致在应用请求值阶段期间未调用UIInput#decode()
个输入组件。 It's exactly that method which resets the validity back to true
要与@this
达到完全相同的效果,您还需要将<h:commandButton><a4j:ajax>
的{{1}}属性明确设置为execute
。
<a4j:ajax>
更新:清除该字段,即您initial problem以及实际上不会在@form
上工作的字段(因此&#34;做我需要的一切&#34;部分是错的),找到解决问题的答案以及JSF 2.x和JSF 1.x目标解决方案:Input fields hold previous values only if validation failed。
答案 1 :(得分:0)
代码不一样。翻译应该是:
<h:commandButton value="#{AppMessages['general.action.cancel']}"
disabled="#{!entityBB.expandState.editable}" immediate="true"
actionListener="#{entityBB.cancel}" >
<a4j:ajax render="initialServicePanel :messages"
status="ajaxStatus" />
</h:commandButton>
主要差异:
<h:commandButton>
,不在<a4j:ajax>
。execute="@this"
,这将更改发送到服务器的数据。