我收到此警告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
但是我认为与我想使用的那个更好
答案 0 :(得分:5)
发生警告是因为给定ID的组件无法在当前ViewRoot
中解析。
出于同样的原因,您的FacesUtils.findComponentById
返回null。
在PrimeFaces中,我们只是添加了此警告,以告知用户要更新的组件可能不存在和/或不会被更新。当然,这可能会导致开发人员出现意外行为。
因此,您的FacesUtils.findComponentById
只是一种会导致性能下降的技巧,因为当组件可用时,'viewRoot.findComponent'将被调用两次。
唯一的真正解决方案是仅在知道组件已渲染的情况下才调用PrimeFaces.current().ajax().update()
。您的视图bean /控制器应该知道当前状态。
否则,请忽略该警告。