【发布时间】: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