PrimeFaces 7.0 Ajax更新警告

时间:2019-10-17 13:40:24

标签: jsf primefaces

我收到此警告org.primefaces.PrimeFaces$Ajax.update PrimeFaces.current().ajax().update() called but component can't be resolved!Expression will just be added to the renderIds.有时在使用PrimeFaces.current().ajax().update时收到上述警告,搜索时我实施了此解决方案https://forum.primefaces.org/viewtopic.php?t=58678

public static UIComponent findComponentById(String componentId) {
    FacesContext context = FacesContext.getCurrentInstance();
    UIViewRoot root = context.getViewRoot();
    return root.findComponent(componentId);
}

为避免收到警告,请执行以下操作:

        if (FacesUtils.findComponentById("pnlEstado") != null) {
            PrimeFaces.current().ajax().update("pnlEstado");
        }

它可以工作,它不再发出警告,因为组件始终可以“找到”进行更新。

这里的问题是我的伴侣说他不确定这是否是处理警告的最佳方法,因为他认为执行警告需要花费很多时间,他说这样然后问客户,然后又返回服务器,再返回客户,他问这是如何工作的,我真的不知道该怎么解释,但我想这是处理它的最佳方法,想知道您对此的看法。

我还尝试了绑定组件,并检查它是否已渲染,但是渲染它始终是事实,因此它总是更新并引发警告。

所以我删除了绑定并使用了这种方式。同样只会发生这种情况是因为我有2个菜单,当打开1个菜单时没有显示另一个菜单,因此我认为这就是为什么有时会发出警告的原因,但是我实施的解决方案可以解决这个问题,无论如何我都会听取您的意见。

这也是他说他希望我解决的方法,我将尝试https://forum.primefaces.org/viewtopic.php?t=32040

但是我认为与我想使用的那个更好

1 个答案:

答案 0 :(得分:5)

发生警告是因为给定ID的组件无法在当前ViewRoot中解析。 出于同样的原因,您的FacesUtils.findComponentById返回null。

在PrimeFaces中,我们只是添加了此警告,以告知用户要更新的组件可能不存在和/或不会被更新。当然,这可能会导致开发人员出现意外行为。

因此,您的FacesUtils.findComponentById只是一种会导致性能下降的技巧,因为当组件可用时,'viewRoot.findComponent'将被调用两次。

唯一的真正解决方案是仅在知道组件已渲染的情况下才调用PrimeFaces.current().ajax().update()。您的视图bean /控制器应该知道当前状态。 否则,请忽略该警告。