【问题标题】:How to iterate through all components displayed on the screen如何遍历屏幕上显示的所有组件
【发布时间】:2010-09-18 22:35:24
【问题描述】:

我有一个高度动态的单页界面,其中各种用户事件触发新字段显示在屏幕上。我正在使用 jsf 1.1 和基本 ajax,但无法使用部分提交。由于这些限制,我已将我的所有字段都标记为必需为假和立即为假。这个想法是仅在用户尝试在操作方法中转换到下一页时才进行验证,而不是在他们关闭并执行 ajax 事件时进行验证。我将立即设置为 false,因为我需要输入以使其进入模态,因此我可以根据业务逻辑有条件地呈现某些字段。

问题:我提前知道“可能的”UIInput id 列表,在任何给定时间可能会或可能不会显示在屏幕上。我的目标是遍历所有这些 UIInputs,检查它们是否被渲染,不为 null,不为空,否则将 UIInput 标记为错误。

这适用于屏幕上未显示的字段。例如,我有一个字段“amountInput”,它的 XHTML 呈现属性设置为 false,因此它不会显示在屏幕上。从显示的角度来看,这是可行的,但是在调用我的操作时,该字段仍将其渲染属性显示为 true,因此我无法知道是否应该验证它。

我有什么选择?

    public boolean validate() {
    boolean hasValidMinimumData = true;

    final List<UIInput> componentList = getComponentList();
    if (CollectionUtils.isNotEmpty(componentList)) {
        for (UIInput curComponent : componentList) {
            final Object curComponentValue = curComponent.getValue();
            if (curComponent.isRendered() && (curComponentValue == null || isNoValue(curComponent))) {
                setError(curComponent); // applies the error
                hasValidMinimumData = false;
            }
        }
    }

    return hasValidMinimumData;
}

【问题讨论】:

    标签: java jsf


    【解决方案1】:

    您需要注意,在表单提交请求期间,与在初始显示期间保持完全相同的条件会导致 rendered 属性的结果。

    最简单的方法是将负责条件的bean放在会话范围内。如果您更喜欢将其放在请求范围内(这是一个非常合理的决定),那么我建议您为此抓住 Tomahawk's t:saveState

    <t:saveState value="#{bean}" />
    

    也就是说,您是否考虑过 Ajax4jsf?它与 JSF 1.1 兼容,并提供 Ajax 与 JSF 的透明集成。

    【讨论】:

    • 感谢 BalusC。你的名字让你受益——我从你的网站学到了很多东西。不幸的是,将 viewbean 放在会话范围内不起作用。我在条件中放置了一个断点,它在我的操作发生之前准确地呈现了它应该如何。就好像绑定到支持 bean 的渲染属性与在 XHTML 中设置渲染属性不同。
    • 我很想使用 Ajax4jsf,但这不是我工作场所的选择。鉴于我的要求,我看到了两个解决方案,每个解决方案都有其缺陷: 1. 在 javascript 中实现所有必需的字段验证 2. 在操作中复制业务逻辑以确定何时以及何时不验证字段,因为我们似乎无法依赖于渲染属性。
    • 渲染的 el 属性是在渲染响应期间评估还是在更新模型/调用应用程序阶段应用?在我当前的代码中,我正在检查动作中的渲染属性,因此它在渲染响应之前。也许这是一个问题。老实说,我有点惊讶我什至可以找到无法显示的组件,因为我认为设置 render=false 会将它从树中排除,使其无法找到。
    • 它还在应用请求值和验证阶段重新评估。顺便说一句,从您最初的问题中,我了解到您正在通过UIComponent#isRendered() 对其进行正确测试,但您的最后一条评论并非如此。当其rendered 属性评估false 时,整个组件从组件树中消失是不正确的。
    • 在我的 XHTML 页面中,我有一个文本字段,它根据条件评估以确定呈现真或呈现假。这部分似乎可以工作,因为该字段是根据此条件有条件地显示的。在我的 viewbean 中,我修改它以使用会话范围,甚至尝试将文本字段绑定到 bean 本身,但我没有看到 isRendered() 属性返回 true 以外的任何内容。
    【解决方案2】:

    已解决!问题是在我的 XHTML 中,我在包含我的输入组件的表格组件上设置了渲染属性。我认为这反过来会在其所有子项上适当地设置渲染属性,但显然不是。

    只需在我的 XHTML 中的实际输入组件上设置条件渲染属性即可解决问题。

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多