0

今天我花了一整天的时间试图理解为什么 xhtml 文件中的值在从<p:commandButton>.

在我将 p:commandButton 更改为 h:commandButton 后,一切正常。这就是我声明命令按钮的方式:

<p:commandButton id="b1" style="height: 30px; width: 30px;" value="a"
    action="#{turnoController.createTurno('a')}"
    onclick="document.getElementById(this.id).disabled=true;"/>

使用此命令按钮它会刷新,但我不知道如何禁用它。

<h:commandButton id="b1" style="height: 30px; width: 30px;" value="a"
    action="#{turnoController.createTurno('a')}"/>

我想问为什么 p:commandButton 与“刷新”页面的值不兼容???

我想要做的是在单击后禁用按钮,但还要更新所有值......

我怎样才能在 xhtml+jsf 中制作它???

4

1 回答 1

0

onclick与页面的刷新值不兼容。更新失败的原因是您的函数可能最终在请求进入阶段之前onclick设置了。这是 JSF 生命周期中的阶段,组件属性被评估并存储为组件的个人属性映射的一部分<p:commandButton disabled="true"/>APPLY_REQUEST_VALUES

JSF 在处理过程中将忽略带有的属性,disabled="true"这就是您正在观察的结果。onclick禁用该按钮还为时过早。

使用 ajax 更新按钮的 disabled 属性以减轻压力:

<p:commandButton id="b1" style="height: 30px; width: 30px;" value="a"
               action="#{turnoController.createTurno('a')}" disabled="#{bean.isButtonEnabled}" >
  <f:event name="postValidate" listener="#{bean.disableButton}"/>
</p:commandButton>

buttonEnabled您将在托管 bean 上定义的属性在哪里,并且disableButton是托管 bean 中用于切换buttonEnabled变量状态的方法。我选择了postValidate组件的事件阶段,因为它在APPLY_REQUEST_VALUESJSF 阶段之后,并且可以安全地假设此时禁用您的按钮不会产生负面影响。

作为替代方案,如果您对仅客户端的解决方案感兴趣,您可以尝试以下选项:

于 2013-06-03T12:38:24.703 回答