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

时间:2012-11-09 16:39:19

标签: ajax jsf primefaces messages

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

这是我的问题所在:重置工作正常,因为它确实删除了无效状态和styleClass。该领域本身看起来非常好。但是,我附加到它的错误消息仍然可见,只会在刷新时消失。我认为重置+重新渲染可以解决这个问题,但唉它没有。

我的下一次尝试是扩展复制方法,以便它清除FacesContext上的消息列表,但这不起作用:当我实际到达我的Bean方法时,它意味着当前上下文传递验证(对于属于execute的字段),因此没有消息。

所以,问题是:有没有办法访问以前附加的未处理组件的消息?基于this answer我在想:

  • 获取目标复合词
  • 遍历其子女
  • 检查每个组件上的消息,如果有的话,删除它们(不知道如何......)

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

任何帮助表示感谢。


将其缩小为以下示例:

test.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>

testBean这个

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

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

行为

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

1 个答案:

答案 0 :(得分:2)

解决了它。根据BalusC的评论,使用<p:resetInput> 重新呈现消息标记本身就可以完美地运行。

错误在我们的设置中很深。当项目开始时,它使用IceFaces作为UI框架,由前同事建立。由于一些不断变化的要求,我们最近改用PrimeFaces。据我所知,所有对IceFaces罐子的引用都包含了以及未被删除的东西 - 但是,今天我发现了一些偏向于IceFaces的偏好。事实证明,由于通过SVN分发,我们所有的机器仍然在后台运行库,而没有任何页面实际使用它。

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

这只是我的一天!我真的不知道发生了什么,但这一次解决了我最神秘的四个错误......是的!

感谢BalusC看一看。我真的非常感谢你在这里的努力。我总是发现你对我的问题的答案是一个很大的帮助,甚至更多的是对其他人的问题的几十个答案,这些答案使我免于猜测并提供了如何做事的好例子。巨大的距离 - 拥抱!