【问题标题】:How to remove FacesMessage on non-processed component after ajax operationajax操作后如何删除未处理组件上的FacesMessage
【发布时间】:2012-11-09 16:39:18
【问题描述】:

我的场景如下:我有一个包含三个地址的表单,每个地址都是一个复合组件。每个地址都有一个链接,可以从其他两个地址之一复制它。该链接通过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;
    }
}

行为

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

【问题讨论】:

  • 这不是正常行为。该消息首先应该在重新渲染时消失(关联的字段根本没有执行/验证,对吧?)。您认为有机会准备 SSCCE 吗?
  • 如果那是您的赞成票:是的,它在 11 月 11 日给了我 111 次代表 ;) 关于主题:我将尝试达到一个最小的示例,但是,可能需要几天时间另一个我必须先解决的问题。
  • 很好的例子。抱歉,我无法重现您的问题。当我将msg2 添加到命令按钮的&lt;f:ajax render&gt; 时,问题就消失了(如预期的那样)。顺便说一下,使用 Mojarra 2.1.14 和 PrimeFaces 3.4.1。

标签: ajax jsf primefaces messages


【解决方案1】:

解决了。根据 BalusC 的 cmets,使用 &lt;p:resetInput&gt; 重新渲染消息标签本身就可以正常工作。

错误在我们的设置深处。项目开始时,它使用 IceFaces 作为 UI 框架,该框架是由一位前同事建立的。由于一些不断变化的需求,我们最近切换到 PrimeFaces。据我所知,所有对 IceFaces jar 和 include 的引用以及诸如此类的东西都已被删除 - 但是,今天我发现了一些仍然提到 IceFaces 的偏好。所以事实证明,由于通过 SVN 分发,我们所有的机器仍然在后台运行库,没有任何页面实际使用它。

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

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

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

【讨论】:

  • 很好的发现。我很感激这个拥抱:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多