我的场景如下:我有一个包含三个地址的表单,每个地址都是一个复合组件。每个地址都有一个链接,可以从其他两个地址之一复制它。该链接通过 设置目标和源地址f:setPropertyActionListener
,然后根据这些参数调用 Bean 方法进行实际复制。该链接有一个f:ajax
仅执行源地址并呈现目标地址的链接。这样,即使页面上的其他地址(例如他们想要复制到的地址)存在验证错误,用户也可以复制。由于目标字段可能无效(因此在我的情况下标记为红色),但在我使用p:resetInput
(Primefaces)重置它们的 Ajax 请求期间未处理。
这是我的问题所在:重置工作正常,因为它确实删除了无效的状态和 styleClass。该字段本身看起来非常好。但是,我附加到它的错误消息仍然可见,并且只会在刷新时消失。我认为重置+重新渲染会解决这个问题,但可惜它没有。
我的下一个尝试是扩展复制方法,以便它清除 处的消息列表FacesContext
,但这不起作用:当我实际到达我的 Bean 方法时,这意味着当前上下文通过了验证(对于)的一部分,execute
因此没有消息。
所以,问题是:有没有办法访问之前附加的未处理组件的消息?基于这个答案,我在想:
- 获取目标组合
- 遍历它的孩子
- 检查每个组件上的消息,如果有,删除它们(虽然不知道如何......)
但也许我想错了。我不确定这些消息是否仍然存在,或者这是否是某种更新视图问题?在这种情况下,我需要知道如何重置输入消息组件(当前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>
测试豆
@ManagedBean(name = "testBean")
@ViewScoped
public class TestBean {
private String string1;
private String string2;
// + getters + setters
public void actionCopyString() {
string2 = string1;
}
}
行为
在字段一中输入一个有效的字符串(至少四个字符)。在字段 2 中输入无效的字符串,然后使用制表符或单击它。该字段变为红色并显示一条消息。然后单击按钮。有效值被复制。幸亏<p:resetInput>
田野也不再红了。但是,该消息仍然显示。将其包含在render
属性中或围绕输入和消息重新渲染容器组件都没有效果。我的目标是在复制操作完成后也让消息消失。