JSF2: перерисовать все компоненты на странице, имеющие заданный идентификатор, без абсолютных путей - PullRequest
2 голосов
/ 26 декабря 2010

Есть ли способ в JSF 2.0 / PrimeFaces перерисовать все компоненты (используя атрибут PrimeFaces update="id1 id2..." или тег <f:ajax render="..."/>) , которые получили данный идентификатор независимо от того, находятся ли они в одной форме с кнопкой, запускающей повторную визуализацию AJAX, или нет?

Например, я хочу, чтобы моя кнопка повторно отображала все разделы на странице, которые визуализируют текущую корзину покупок пользователя.

Прямо сейчас мне всегда нужно указывать абсолютный путь к компонентам, которые я хочу обновить, например,

update=":header:basket :left-sidebar:menu:basket"

, что довольно непрактично, если структура страницы изменится (кроме того, я не смог найти правильный путь для одного из этих компонентов). Я уже пытался реализовать пользовательскую EL-функцию, подобную этой, которая пересекает дерево компонентов:

update="{utilBean.findAllComponentsMatchingId('basket')}"

но во время оценки функции, очевидно, не было настроено все дерево компонентов, поскольку оно не содержит компонентов, которые я ищу.

Как я могу справиться с этим? Конечно, должен быть простой способ делать обновления на основе AJAX разделов страницы, которые не являются частью текущей <h:form>?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 декабря 2010

Каково определение вашего метода findAllComponentsMatchingId?Это, кстати, не похоже на пользовательский вызов функции EL.Кроме того, "{}" вообще не является выражением EL, но я предполагаю, что это опечатка.

Возможно, проблема в том, как работает ваш findAllComponentsMatchingId, а не в том, что компоненты еще не находятся в дереве?Для некоторого вдохновения может быть полезно взглянуть на метод findComponentFor в этом классе RendererUtils .

В качестве альтернативы вы можете попробовать связать компоненты, которые вы хотите обновить, с областью или видом запроса.Карта области видимости.

Например, определите вface-context.xml:

<managed-bean>
    <managed-bean-name>updates</managed-bean-name>
    <managed-bean-class>java.util.HashMap</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Затем привяжите свои компоненты к этому:

<x:someComponent binding="#{updates['foo']}"

И затем напишите функцию EL, котораяперебирает эту updates карту и возвращает разделенный пробелами список всех идентификаторов клиентов компонентов (component.getClientId(FacesContext.getCurrentInstance())).

0 голосов
/ 26 декабря 2010

Поскольку (я думаю) это определяется тем, как работает UIComponent.findComponent(..), боюсь, вам не повезло.Ближайший контейнер именования берется в качестве основы для поиска.

В любом случае, перерисовки между формами не должны быть настолько распространенными.И именование контейнерных структур не должно меняться так часто.

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