【问题标题】:How to iterate over variable in param using JSF EL expression如何使用 JSF EL 表达式迭代参数中的变量
【发布时间】:2012-12-28 21:13:21
【问题描述】:

我有一个 PrimeFaces <p:dataGrid> 组件,其中包含可变数量的面板。每个面板都包含许多派生组件。我在每个面板中都包含一个删除按钮,以允许删除。我在 dataGrid 之外还有一个添加按钮。我没有在按钮上使用immediate="true",而是想出了如何在每个面板中设置每个组件的必需属性。

例如:

required="#{empty param['vehicleGrid:0:btnDelete'] and empty param['btnAdd']}". 

对于 dataGrid 中的每个删除按钮和添加按钮,忽略组件验证。

如果 dataGrid 内部有一个面板,则此方法有效,但它仅引用第一个面板。我需要动态检查每个面板。也许不是从标记页面查看它,也许我需要用 Java 术语查看它,因为 param 是 Map<String, String>

【问题讨论】:

    标签: jsf-2 primefaces el


    【解决方案1】:

    将删除按钮组件绑定到视图并改用UIComponent#getClientId()

    <h:inputText ... required="#{empty param[deleteButton.clientId]}" />
    ...
    <h:commandButton binding="#{deleteButton}" ... />
    

    这样,正确的客户端 ID 将在参数映射中查找,然后无需遍历参数映射。

    【讨论】:

    • 好吧,几乎成功了!我可以看到删除按钮所在的面板绕过了该面板中的验证,但是如何忽略所有面板?假设我添加了 3 个空面板,然后尝试删除最后一个面板。由于触发了前两个面板的验证,因此它不会这样做。在这种情况下,一个面板中的删除按钮将忽略所有面板中的验证。
    • 那么,您使用的是 PrimeFaces 命令按钮吗?设置process="@this" 而不是(默认)process="@form"。哦等等...这样你就完全不需要required 条件,你可以坚持required="this" :)
    • 嗯,我最初是这样做的,直到遇到视图和支持 bean 之间的数据问题。例如,我有 3 辆车,每辆车都有一个年份属性。我分别进入 2008 年、2010 年和 2012 年。然后我删除第一辆车。我看到的不是 2010 年和 2012 年,而是 2008 年和 2012 年。支持列表具有正确的数据,但由于某种原因显示了先前的数据。更糟糕的是,如果我添加或更新了新车辆,“幽灵”数据只会覆盖支持列表。这让我发疯了,直到另一位发帖人建议稍微简化代码。
    • 只是为了好玩,我添加了 process="@this" 甚至添加了 p:ajax update="@this" 到目前为止一切都很好。 3天前这不起作用,因为我手动刷新了屏幕,值会改变。需要 ajax 标记,以便按钮单击不会清除任何新值的值。
    猜你喜欢
    • 2013-09-02
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2013-06-29
    • 2013-03-20
    • 2014-06-21
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多