jsf - PrimeFaces 7.0 Ajax 更新警告

标签 jsf primefaces

我收到此警告 org.primefaces.PrimeFaces$Ajax.update 调用了 PrimeFaces.current().ajax().update() 但无法解析组件!表达式将仅添加到 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");
        }

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

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

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

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

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

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

最佳答案

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

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

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

唯一真正的解决方案是只调用 PrimeFaces.current().ajax().update() 如果您知道组件已呈现。您的 View bean/ Controller 应该知道当前状态。 否则就忽略警告。

关于jsf - PrimeFaces 7.0 Ajax 更新警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58434076/

相关文章:

jsf - PrimeFaces 3.2 DataTable "jump to page"分页器模板?

javascript - Primefaces 编辑器模糊事件

java.sql.BatchUpdateException : Cannot add or update a child row: a foreign key constraint fails ERROR

java - 在 primefaces 的 InputNumber 上使用自定义类型的 NumberFormatException

maven - 无法编译 PrimeFaces 演示

javascript - 使用 <h :outputScript> to add javascript code in JSF

jsf - 如何使数字输入区域最初为空而不是0或0.00?

JSF2 : how achieve site-wide viewParam handling policy using a template

java - 如何在用户按 Tab 时检查文本框值

jsf - 启用选择时,DataModel 必须实现 org.primefaces.model.SelectableDataModel。