a4j:commandButton和h:commandButton之间的区别是a4j:ajax

时间:2014-07-04 13:04:22

标签: ajax jsf richfaces ajax4jsf

我有以下按钮:

<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将其从错误中删除(红色边框)但保留了值。它与上面完全相同的输入。我无法解释它......任何人?

2 个答案:

答案 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",这将更改发送到服务器的数据。
相关问题