【问题标题】:Primefaces component does not updatePrimefaces 组件不更新
【发布时间】:2012-02-14 16:36:38
【问题描述】:

我有一个用于在 3.0.1 中自我更新的 p:dataGrid。现在我升级到 PF 3.1 并且“availableIcons”组件的 ajax 更新事件不再触发。我没有收到在视图中找不到组件的错误消息。

XHMTL

<h:form id="Application">
......
<p:confirmDialog id="iconDialog" message="Select one icon"
            showEffect="bounce" hideEffect="explode" header="Icon Selection"
            severity="alert" widgetVar="iconSelect" modal="false">

            <p:dataGrid id="availableIcons" var="icon"
                value="#{appEditController.availableIcons}" columns="4">

                <p:column>
                    <p:panel id="pnl" header="" style="text-align:center">
                        <h:panelGrid columns="1" style="width:100%" id="iconPanelGrid">
                            <p:graphicImage value="/resources/icons/#{icon.icon}"
                                id="iconImage" />
                            <p:selectBooleanCheckbox id="iconSelector"
                                value="#{icon.selected}"
                                disabled="#{appEditController.isIconSelected(icon)}">
                                <p:ajax update="availableIcons" event="change"
                                    process="availableIcons"
                                    listener="#{appEditController.iconSelectedChanged(icon)}" />
                            </p:selectBooleanCheckbox>
                        </h:panelGrid>
                    </p:panel>

                </p:column>

            </p:dataGrid>

            <p:commandButton value="Done" update="currentIcon"
                action="#{appEditController.updateCurrentIcon}" ajax="false"
                oncomplete="iconSelect.hide()" />

        </p:confirmDialog>

.......
</h:form>

我看不出有什么缺失或不正确。

这是后台 bean 代码

public void updateCurrentIcon() {
    for (IconVO iconVO : availableIcons) {
        if (iconVO.isSelected()) {
            log.debug("CURRENT ICON IS NOW " + iconVO.getIcon());

            currentIcon = iconVO;

            break;
        }
    }
}

public void iconSelectedChanged(IconVO iconVO) {


    if (iconVO == currentIcon) {
        log.debug("NULLING ICON");
        currentIcon = null;
    } else {
        log.debug("SETTING NEW ICON");
        currentIcon = iconVO;
    }

}

public boolean isIconSelected(IconVO iconVO) {

    log.debug("IS ICON SELECTED " + iconVO.getIcon());

    if (currentIcon == null
            || iconVO.getIcon().equals(currentIcon.getIcon())) {
        return false;
    }

    return currentIcon != null;
}

我尝试执行 update="@form",然后更新触发但它完全关闭了模式面板。

谢谢, 科恩

【问题讨论】:

  • 您的具体问题不清楚。你说组件没有更新,但你也说 ajax 事件没有触发。现在具体的问题是什么?您不是说 实际上 触发了 ajax 请求,但 ajax 响应不包含更新吗?如果您不确定,请再次查看特定于浏览器的 Web 开发人员工具集。
  • 好的,我的意思是 ajax 更新事件不再触发。实际的 ajax 更改事件仍然发生。我会重写的。
  • ajax响应中是否有更新?
  • 嗨 BalusC,我不太明白你对 ajax 响应的意思。发生的情况是更改事件触发,因此调用了侦听器中的方法,但唯一更新的组件是当前复选框,数据网格上的其他复选框未评估。
  • JavaScript 触发的 HTTP 请求的响应。在 Chrome/IE9 中,您可以在开发人员工具的“网络”选项卡中看到它(按 F12)。在 Firefox 中,您需要先为此安装 Firebug 插件。

标签: java ajax jsf primefaces


【解决方案1】:

确实,PrimeFaces 通过相对客户端 ID 定位组件的方式一直是 changed in PrimeFaces 3.1 遵循 UIComponent#findComponent() javadoc

在您的特定情况下,您需要指定&lt;p:dataGrid&gt;绝对 客户端ID。最简单的方法是检查生成的 HTML 源代码中&lt;p:dataGrid&gt; 的 ID。到目前为止给出的代码是Application:availableIcons。您需要在它前面加上: 使其成为绝对值,然后在update 中引用它,如下所示:

<p:ajax update=":Application:availableIcons" ... />

更新 根据 cmets 结果证明根本不起作用。您可以尝试将表格包装在一些不可见的包含组件中,例如 &lt;h:panelGroup&gt; 并更新它。或者,您可以考虑将&lt;h:form&gt; 移动到对话框中并改用update="@form"。无论如何,在对话框之外有&lt;h:form&gt; 有点奇怪。您肯定不会在同一表单内提交对话框之外的所有其他输入。

【讨论】:

  • 嗨 BalusC,我在发布此问题之前尝试了所有这些组合。我知道 3.1 中的新变化。当我执行 update=":Application:availableIcons" 仍然没有完成更新并且我得到响应 。当我使用 update="Application:availableIcons" 时,我得到一个“视图错误中找不到组件”。很奇怪吧?
  • 另一件事是,在 3.0.1 中,我使用了 update="Application:availableIcons" 并且运行良好。
  • 您可以考虑将表单移到对话框中并改用update="@form"。无论如何,将表单放在对话框之外有点奇怪。您肯定不会在同一个表单内提交对话框之外的所有其他输入,对吧?
  • 嗨 BalusC,代码实际上是来自一个非常复杂的 GUI 的 sn-p,所以一切都在一个形式中。我将尝试使对话框成为一个单独的表单,看看它是否确实可以作为一种解决方法。谢谢
  • 那是个好主意。拥有“神形”不一定是最佳实践。这样,您默认提交/处理/转换/验证同一表单内的 everything。如果您有多个“部分”,则可能会相互干扰。将这些“部分”分别放在自己的 &lt;h:form&gt; 中。
猜你喜欢
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 2011-06-02
  • 2012-07-26
  • 2016-09-27
  • 2016-10-21
  • 2015-04-12
  • 1970-01-01
相关资源
最近更新 更多