【问题标题】:jsf2 highlight components with FacesMessages (o:highlight)jsf2 使用 FacesMessages 突出显示组件 (o:highlight)
【发布时间】:2013-06-20 08:10:10
【问题描述】:

我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们应该接受每个输入。

这样我不能使用普通的验证器,但有一个命令按钮,它评估它的操作方法中的数据,并在缺少某些东西时创建一些与特定 clientIds 相关的 FacesMessages。

现在我通常使用 OmniFaces o:highlight 组件来指向需要进一步操作的字段,但在这种情况下,输入组件是有效的,因此突出显示组件不会考虑它们。

现在我想知道这种行为是否可能取决于带有消息的 Id 列表。

类似这样的:

for (Iterator<String> it = FacesContext.getCurrentInstance()
                .getClientIdsWithMessages(); it.hasNext();) {
        String clientId = it.next();
        List<FacesMessage> messageList = FacesContext
                .getCurrentInstance().getMessageList(clientId);
        if (messageList != null) {
            for (FacesMessage msg : messageList) {
                ... // build json with clientIds (maybe check for UIInput
            }
        }
}

如果需要这种方式,可以为信息、警告和错误消息引入新的样式类。也许它甚至更快一些,因为不必访问整个组件树,但这只是一个猜测。

那么你的意见是什么?这是对当前行为的一个相当艰难的改变,所以我不确定这个猜测是否会使其成为全方位的,还是必须单独实施。

【问题讨论】:

    标签: jsf-2 omnifaces


    【解决方案1】:

    现在我想知道这种行为是否可能取决于带有消息的 Id 列表。

    来自与您linked 相同方法的javadoc:

    请注意,FacesContext#getClientIdsWithMessages() 也可以查询,但它并不表示与这些客户端 ID 关联的组件是否实际上是 UIInput 组件而不是 UIInput#isValid()

    因此,对于每个客户端 ID,您仍需要使用 UIViewRoot#findComponent() 来查找组件、确定其类型并验证其有效性。这比一次树访问要昂贵得多。

    如果您确实需要在 action 方法中执行验证,最好的办法是自己将上下文和输入标记为无效。

    FacesContext context = FacesContext.getCurrentInstance();
    context.validationFailed();
    ((UIInput) context.getViewRoot().findComponent(clientId)).setValid(false);
    

    或者,为了满足具体的功能要求,

    我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们应该接受每个输入。

    只需使用普通的验证器来检查调用的操作:

    public void validate(FacesContext context, UIComponent component, Object value) {
        if (!context.getExternalContext().getRequestParameterMap().containsKey("formId:buttonId")) {
            return;
        }
    
        // ...
    }
    

    即当调用&lt;h:form id="formId"&gt;&lt;h:commandButton id="buttonId"&gt; 时,将执行验证。这总是比在错误的地方执行验证要好。

    【讨论】:

    • 感谢您的提示,我将不得不使用第一种方法,因为第二种方法不起作用,因为我必须检查一些必填字段并且它们的问题是,周围的组件(带有 switchType="ajax" 的丰富:tabPanel)将在更改选项卡时提交它的完整内容(所以我也在寻找按钮),我无法以任何方式影响它(至少目前不是)。无论如何,不​​同 FacesMessage.SEVERITY 类型的不同风格的想法对你来说并不有趣?我认为不仅在无效时通过消息突出显示组件可能很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多