【问题标题】:How to only update JSF/Primefaces component value upon Ajax sucess, but do nothing on Ajax failure如何仅在 Ajax 成功时更新 JSF/Primefaces 组件值,但在 Ajax 失败时不执行任何操作
【发布时间】:2017-04-26 23:39:09
【问题描述】:

我有一个使用 Primefaces 5.3 的 JSF 前端,它使用 Ajax 动态更新字段。我遇到的问题是有时我的 Ajax 调用失败(例如:服务器响应 500),但我的前端仍在更改。本质上,如果我的 ajax 失败,我希望阻止输入字段的更改。换句话说,我只希望输入字段在成功的 Ajax 响应时发生变化。

我对 JSF 还很陌生,所以我不确定如何处理这个问题。在常规的 HTML/JS 中,我可以在 onclick 中存储值,并在我的 ajax 错误处理程序中恢复该值,但我不知道如何使用 PF 框架来做到这一点。

        <div class="Container25">
            <p:selectOneRadio id="grid" value="#{cc.attrs.answer.singleAnswer.codeValue}" layout="grid" columns="1" >
                <f:selectItems value="#{cc.attrs.menuItems}" 
                               var="item" itemLabel="#{msg[item.code]}" itemValue="#{item.code}" itemLabelEscaped="false"/>

                 <p:ajax  event="change"  listener="#{cc.attrs.onChange}" update="#{cc.attrs.update}" disabled="#{cc.attrs.onChange == null }" global="false" />
            </p:selectOneRadio>
        </div>

我尝试将 resetValues 属性添加到 ajax 组件,但没有帮助。此外,我尝试在 onstart 处理程序中添加一些自定义 JS,但未定义。

我认为必须有一种简单的 JSF/PF 方式来执行此操作,但似乎找不到。

如何在 Ajax 调用成功返回之前阻止输入值更改(即:仅更改 onsuccess 处理程序中的值)或在我的 Ajax 调用失败时重置我原来的单选按钮选择?我需要在我的 onerror 处理程序中放入什么来恢复 pre-ajax 状态?

【问题讨论】:

  • 我会从防止 500 错误开始,或者在错误页面中报告发生的情况。只是恢复值并保持在同一页面上是没有用的,因为输入相同的值会再次失败。
  • @kukeltje。同意,但这不是目前的问题。我确实需要处理这种情况,但我还需要确保前端处于已知或稳定状态。本质上,值更改取决于成功的 Ajax 调用。所以如果 Ajax 没有返回 200,我不希望我的值改变。
  • 我会考虑使用 passthrough 属性来存储原始值并在错误时将它们交换回来,但要了解您必须遍历具有相同名称的无线电元素并设置检查属性。或者在onclick事件中手动进行同步ajax调用,失败则返回false。您可以检查渲染源以查看 ajax 的 primefaces JS 函数。请记住,这可能会在未来的版本中影响您...
  • 如果您确定模型中的值没有更改,为什么不以非 ajax 方式完全重新加载页面(获取请求,它将重新加载所有内容),或者使用 @987654322 @功能...(例如,结合下面的答案,因为这是需要的)如果您知道下一个请求将成功,为什么不让用户再次提交相同的请求,如果您不知道的话,为什么不防止用户输入错误的值...

标签: ajax jsf primefaces jsf-2


【解决方案1】:

您可以使用 Primefaces RemoteCommand 组件获得简单的解决方案,只需将其嵌入到您的表单中:

<p:remoteCommand name="revertSomeValues"
            actionListener="#{relatedBean.revertValuesToDefaults}"
            update="componentId" />

在 bean 端你可以操作模型:

@Named
@ViewScoped
public class relatedBean implements Serializable {

  Integer  codeValue;
  //other model attributes and methods...

  public void revertValuesToDefaults() {        
     setCodeValue(0); //supposing 0 is the default value
    //handle other model attributes if needed
  }
}

现在你可以设置类似的 onerror 回调 -> onerror="revertSomeValues()"

如果需要,您还可以从 bean 以编程方式使用 Primefaces RequestContext 更新组件:

RequestContext context = RequestContext.getCurrentInstance();
context.update("componentId");

【讨论】:

  • 你什么时候打电话? ajax 导致 500 错误?更好地防止该错误
  • 是的,但我认为它是一个临时的服务器故障(可能因无法在该特定请求的范围内分发的请求而过载等),否则整个问题变得无关紧要,因为服务器不断停机,不是吗?
  • 现在的问题或技巧是如何知道前面的值是什么。假设我不想要默认值,而只想要输入在 Ajax 错误之前的值。有没有办法保存该值以恢复它?
  • 在这种情况下,使用远程命令可能会失败......是的,我认为这个问题是不相关/错误的方法。查看我对问题的评论
  • 是的,可能。但是没有其他选择,只能发出另一个 ajax 请求来尝试处理这种情况。无论是否使用远程命令(我建议使用方便)。如果服务器是 %100 死机当然没有工作。似乎 OP 在问不同的事情。
猜你喜欢
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2014-06-11
相关资源
最近更新 更多