Предупреждение об обновлении Ajax в PrimeFaces 7.0 - PullRequest
1 голос
/ 17 октября 2019

Я получаю это предупреждение 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

Но я думаю, что лучше с тем, который я хочу использовать

1 Ответ

5 голосов
/ 17 октября 2019

Предупреждение возникает из-за того, что компонент для данных идентификаторов не может быть разрешен в текущем ViewRoot. По той же причине ваш FacesUtils.findComponentById возвращает ноль.

В PrimeFaces мы только что добавили это предупреждение, чтобы сообщить пользователю, что компонент, который будет обновлен, скорее всего, отсутствует и / или не будет обновлен. Это, конечно, может привести к неожиданному поведению для разработчика.

Таким образом, ваш FacesUtils.findComponentById - это просто взлом, который ведет к снижению производительности, так как viewRoot.findComponent будет вызываться дважды, когда компонент доступен.

Единственное реальное решение - вызывать PrimeFaces.current().ajax().update(), только если вы знаете, что компонент отображается. Ваш bean-компонент / контроллер должен знать текущее состояние. В противном случае просто проигнорируйте предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...