PrimeFaces 7.0 Ajax 更新警告



我收到此警告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 个菜单,当一个菜单打开时,另一个菜单不显示,所以我认为这就是更新有时会引发警告的原因,但我实施的解决方案解决了它,无论如何我愿意接受您的意见。

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

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

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

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

因此,您的FacesUtils.findComponentById只是一个黑客攻击,会导致性能变差,因为当组件可用时,"viewRoot.findComponent"将被调用两次。

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

最新更新