PrimeFaces 7.0 Ajax 更新警告

PrimeFaces 7.0 Ajax Update Warning

我收到此警告 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");
        }

它起作用了,它不再抛出警告,因为组件总是 "findable" 用于更新。

这里的问题是我的合作伙伴说他不确定这是否是处理警告的最佳方式,因为他认为在生产中执行它会花费很多时间,他说就像这转到客户端,然后返回到服务器,然后再返回到客户端,他问这是如何工作的,我真的不知道如何解释,但问题是我认为这是处理它的最佳方式,想知道你的意见它。

我也尝试过绑定组件并检查它是否被渲染,但它总是被渲染,所以它总是更新并抛出警告。

所以我删除了绑定并以这种方式使用。这也只是因为我有 2 个菜单,当 1 个打开时,另一个不显示,所以我认为这就是为什么更新有时会抛出警告,但我实施的解决方案解决了它,无论如何我对你的意见持开放态度。

也是他说他更喜欢我解决的方式,我试试https://forum.primefaces.org/viewtopic.php?t=32040

但我觉得我想用的那个更好

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

在 PrimeFaces 中,我们刚刚添加了这个警告来通知用户,要更新的组件可能不存在 and/or 不会更新。这当然会导致开发人员出现意外行为。

所以你的 FacesUtils.findComponentById 只是一个 hack 导致性能更差,因为 'viewRoot.findComponent' 将在组件可用时被调用两次。

唯一真正的解决方案是仅在您知道组件已呈现时才调用 PrimeFaces.current().ajax().update()。您的视图 bean/controller 应该知道当前状态。 否则忽略警告。