我有一个JSF页面,可加载对象的属性(其ID在URL中传递)。加载可能会持续几秒钟,因此我想显示一个等待/忙碌指示器或“正在加载...”消息。

这是使用“viewAction”完成的

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

有没有简单的方法可以实现这一目标?我正在使用Primefaces。

最佳答案

PrimeFaces已经为此准备好了一个组件:<p:outputPanel deferred="true">。您只需要确保#{heavyBean}仅在<c:xxx>中的组件中(而不是在像<p:outputPanel>这样的标记文件中,由于here解释的原因而在诸如@PostConstruct的标记文件中)引用了,而不是在其他地方引用了。

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

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

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

然后,您可以使用其<f:viewAction>方法完成繁重的工作。完成您最初在@PostConstruct中的@Inject中所做的工作。
@Named
@ViewScoped
public class HeavyBean implements Serializable {

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

    // ...
}

如果您需要访问其他bean的属性,只需在HeavyBean<p:outputPanel>这些bean。例如。如果您需要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.
}

ojit_code已经带有动画gif。您可以通过CSS轻松customize它。

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

09-16 11:49