【问题标题】:PrimeFaces 7.0 Ajax Update WarningPrimeFaces 7.0 Ajax 更新警告
【发布时间】:2019-10-17 13:40:24
【问题描述】:

我收到此警告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

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

【问题讨论】:

  • 你检查客户端这个组件的 ID 是什么?您是否尝试一起删除更新?应用程序还在工作吗?
  • @Kukeltje 我会尝试一起删除更新,它是包含面板的整个表单的 id,我会检查会发生什么
  • @Kukeltje 如果我删除更新,菜单将不会显示,并且用户的“现金金额”也不会显示在菜单顶部并不断更新,我需要它们 = /,但请看我与tandraschko的讨论,认为我将不得不等待7.1版本,同时我将使用我的问题的解决方案:)

标签: jsf primefaces


【解决方案1】:

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

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

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

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

【讨论】:

  • 但问题是这个更新是在方法内部调用的,这些方法在类的构造后执行,并且根据用户在构造后执行的操作再次执行此方法,但我无法评估是否它们是通过绑定呈现的,因为它总是返回 true,但是更新仍然会引发警告,那么其他解决方案呢? forum.primefaces.org/viewtopic.php?t=32040
  • 我只想忽略警告,但堆栈跟踪真的很大 =/
  • “框架级别”没有解决方案。您可能会根据条件(rendered=#{myBean.something})渲染您的pnlEstado。基于相同的条件,您可以拨打或不拨打PrimeFaces.current().ajax().update()
  • 我无法 100% 关注,但如果您通过 css 隐藏它们,该组件仍位于可用的 ViewRoot 中,并且不应记录警告。我们还可以引入类似:PrimeFaces.current().ajax().tryUpdate(),它只是忽略此类警告并且不记录它。
  • github.com/primefaces/primefaces/issues/5251 我现在将警告减少到 ProjectStage==Development 并删除了堆栈跟踪。
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多