Как отобразить индикатор ожидания для f: viewAction? - PullRequest
3 голосов
/ 07 июня 2019

У меня есть страница JSF, которая загружает свойства объекта (идентификатор которого передается в URL). Загрузка может длиться больше секунд, поэтому я хотел бы отобразить индикатор ожидания / занятости или сообщение «Загрузка ...».

Это делается с помощью "viewAction"

<f:metadata>
    <f:viewAction action="#{myBean.loadParams}" />
</f:metadata>

Есть ли простой способ достичь этой цели? Я использую Primefaces.

1 Ответ

3 голосов
/ 12 июня 2019

В PrimeFaces уже есть готовый компонент: <p:outputPanel deferred="true">.Вам нужно только убедиться, что #{heavyBean} является только , на который ссылается компонент (и, следовательно, определенно не находится в файле тегов, подобном <c:xxx> по причинам, объясненным здесь ) внутри <p:outputPanel>, а не где-то еще.

...
#{notHeavyBean.property}
...

<p:outputPanel deferred="true">
    ...
    #{heavyBean.property}
    ...
</p:outputPanel>

...
#{anotherNotHeavyBean.property}
...

Тогда вы можете выполнить тяжелую работу с помощью метода @PostConstruct.Сделайте ту работу, которую вы изначально делали в <f:viewAction> там, в @PostConstruct.

@Named
@ViewScoped
public class HeavyBean implements Serializable {

    @PostConstruct
    public void init() {
        // Heavy job here.
    }

    // ...
}

Если вам нужен доступ к свойствам других bean-компонентов, просто @Inject эти bean-компоненты в HeavyBean.Например, в случае, если вам нужен параметр представления ID:

<f:viewParam name="id" value="#{notHeavyBean.id}" />

@Inject
private NotHeavyBean notHeavyBean; // Also @ViewScoped.

@PostConstruct
public void init() {
    Long id = notHeavyBean.getId();
    // Heavy job here.
}

<p:outputPanel> уже поставляется с анимированным GIF.Вы можете легко настроить через CSS.

.ui-outputpanel-loading {
    background-image: url("another.gif");
}
...