ajax - ajax操作后如何删除未处理组件上的FacesMessage

标签 ajax jsf primefaces message

我的场景如下:我有一个包含三个地址的表单,每个地址都是一个复合组件。每个地址都有一个链接,可以从其他两个地址之一复制该地址。该链接通过 f:setPropertyActionListener 设置目标和源地址,然后调用 Bean 方法根据这些参数进行实际复制。该链接有 f:ajax只执行源地址并渲染目标地址。这样,即使页面上的其他地址(例如他们想要复制到的地址)存在验证错误,用户也可以进行复制。由于目标字段可能无效(因此在我的情况下标记为红色),但在 Ajax 请求期间不会进行处理,我使用 p:resetInput (Primefaces)让它们重置。

这是我的问题所在:重置工作正常,因为它确实删除了无效的状态和样式类。 field 本身看起来非常好。但是,我附加到它的错误消息仍然可见,并且只会在刷新时消失。我以为重置+重新渲染可以解决这个问题,但可惜事实并非如此。

我的下一个尝试是扩展复制方法,以便它清除 FacesContext 处的消息列表。 ,但这行不通:当我实际到达 Bean 方法时,这意味着当前上下文通过了验证(对于 execute 中的字段),因此没有消息。

那么,问题是:有没有办法访问未处理组件之前附加的消息?基于this answer我在想这样的事情:

  • 获取目标组合
  • 遍历其子级
  • 检查每个组件上的消息,如果有,则将其删除(但不知道如何操作......)

但也许我的想法是错误的。我不确定这些消息是否仍然存在,或者这是否是某种更新 View 问题?在这种情况下,我需要知道如何重置输入消息组件(当前 render 使用封闭的 h:panelGroup 作为目标,asfaik 应该正确地重新渲染消息,就像它对输入所做的那样...... )

感谢任何帮助。


将其简化为以下示例:

测试.xhtml

<h:inputText id="string1" value="#{testBean.string1}" style="#{component.valid ? '' : 'background-color:red;'}">
    <f:validateLength minimum="4" />
    <f:ajax render="@this msg1" />
</h:inputText>
<h:message id="msg1" for="string1" />
<br /><br/>

<h:inputText id="string2" value="#{testBean.string2}" style="#{component.valid ? '' : 'background-color:red;'}">
    <f:validateLength minimum="4" />
    <f:ajax render="@this msg2" />
</h:inputText>        
<h:message id="msg2" for="string2" /><br /><br/>

<h:commandButton actionListener="#{testBean.actionCopyString}" value="Click me">
    <f:ajax execute="string1" render="string2" />
    <p:resetInput target="string2" />
</h:commandButton>

测试Bean

@ManagedBean(name = "testBean")
@ViewScoped
public class TestBean {
    private String string1;
    private String string2;
    // + getters + setters

    public void actionCopyString() {
    string2 = string1;
    }
}

行为

在字段一中输入有效字符串(至少四个字符)。在第二个字段中输入无效字符串,然后按 Tab 或单击退出。该字段变为红色并显示一条消息。然后单击按钮。复制有效值。感谢<p:resetInput>田野也不再是红色的。但是,该消息仍然显示。将其包含到render中属性或围绕输入和消息重新渲染容器组件没有效果。我的目标是在复制操作完成后让消息消失。

最佳答案

解决了。根据 BalusC 的评论,使用 <p:resetInput> 重新渲染消息标签本身工作得很好。

这个错误存在于我们设置的深处。项目开始时,它使用 IceFaces 作为 UI 框架,该框架是由一位前同事建立的。由于一些要求的变化,我们最近改用 PrimeFaces。据我所知,所有对 IceFaces jar 和包含内容的引用都已被删除 - 然而,今天我发现一些偏好仍然引用了 IceFaces。事实证明,由于通过 SVN 进行分发,我们所有的机器仍在后台运行该库,而没有任何页面实际使用它。

显然,IceFaces 的一些生成输出与 PrimeFaces 的输出发生冲突(从我体验到的效果来看,可能是一些 JavaScript 和主题相关的 styleClass)。虽然现在我的页面上的一些样式看起来有点奇怪,p:resetInput突然按预期工作 - 以及其他一些组件(例如 p:growl)到目前为止还没有工作。

这让我很开心!我真的不知道发生了什么,但这一下子解决了我最神秘的四个错误......耶!

感谢 BalusC 的浏览。我真的非常非常感谢你在这里所做的努力。我总是发现您对我的问题的回答对我很有帮助,更重要的是,对其他人的问题的数十个答案使我免于猜测,并提供了如何做事情的很好的例子。巨大的距离拥抱!

关于ajax - ajax操作后如何删除未处理组件上的FacesMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13312196/

相关文章:

javascript - 为什么 Polmyer iron-ajax 在参数更改时不会自动请求?

javascript - ajax 调用 webmethod 在 asp.net 中未成功

java - 由错误页面处理的 ViewExpiredException,仍在日志中

spring - 文件上传在 Primefaces 中不起作用

javascript - 使用 Ajax 加载数据后 jQuery 不会更改所选选项

php - 将多行插入从while循环获取的mysql

java - 渲染 <p :outputPanel> based on selected <h:selectOneRadio > option in JSF

css - 如何在 richfaces 之后加载自定义 css?

spring - primefaces.THEME 值在 web.xml 中被忽略

java - 如何关联两个 selectManyListbox?