我有一个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");
}