我试图达到的目标
我有一个rich:tabPanel
withswitchType="client"
并且其中一个选项卡已将其设置为switchType
,ajax
因为加载其数据是一项昂贵的操作。当我单击此Ajax 选项卡时,我希望将其标题更改为Loading...以表明单击已被识别。完成加载后,标题应切换回Ajax Tab。
[Client Tab] [Ajax Tab]
<click on 'Ajax Tab'>
[Client Tab] [Loading...]
<wait...>
[Client Tab] [Ajax Tab]
<click on 'Client Tab'>
[Client Tab] [Ajax Tab]
问题描述
实际上,上述大部分内容都按预期工作,我唯一的问题是,当我从Ajax 选项卡导航到任何其他选项卡时, Ajax选项卡的标题会切换回Loading...:
[Client Tab] [Ajax Tab]
<click on 'Ajax Tab'>
[Client Tab] [Loading...]
<wait...>
[Client Tab] [Ajax Tab]
<click on 'Client Tab'>
[Client Tab] [Loading...]
研究
我在RichFaces 的 JIRA中发现了一个问题,但这个问题自 3.2.1 版以来已得到修复。此外,我用谷歌搜索了几个小时,但找不到任何类似的问题。
环境
- 雄猫 7.0.30
- 莫哈拉 2.1.12
- RichFaces 4.2.2.Final
代码(减少)
JSF
<ui:composition template="WEB-INF/templates/default.xhtml">
<ui:define name="content">
<h:form id="form">
<rich:tabPanel id="tabPanel" switchType="client">
<rich:tab id="clientTab">
<f:facet name="header">
<h:outputText value="Client Tab" />
</f:facet>
<h:outputText value="Foo" />
</rich:tab>
<rich:tab id="ajaxTab" switchType="ajax" status="ajaxTabStatus">
<f:facet name="header">
<a4j:status id="ajaxTabStatus">
<f:facet name="start">
<h:outputText value="Loading..." />
</f:facet>
<f:facet name="stop">
<h:outputText value="Ajax Tab" />
</f:facet>
</a4j:status>
</f:facet>
<h:outputText value="#{bean.value}" />
</rich:tab>
</rich:tabPanel>
</h:form>
</ui:define>
</ui:composition>
Ajax Tab的Backing Bean
@ManagedBean
@ViewScoped
public class Bean implements Serializable {
private static final long serialVersionUID = -8405248908693334970L;
private String value = "noValue";
private static final Logger log = LoggerFactory.getLogger(Bean.class);
@PostConstruct
public void init() {
log.info("Init bean.");
value = getDummyValueWithFakeDelay();
}
public String getValue() {
log.info("Get value.");
return value;
}
private String getDummyValueWithFakeDelay() {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
return DateFormat.getTimeInstance().format(new Date());
}
}
更新1:
我发现 an 的标识符(我的意思是您指定<rich:someTag ... status="someStatus" />
的一个 like )a4j:status
不是它id
,而是它的name
属性。所以我a4j:status
的只是针对该页面上的每个Ajax 请求。给它一个名字并使用这个命名状态是行不通的,因为现在什么都没有发生。
<rich:tab id="ajaxTab" switchType="ajax" status="ajaxTabStatus">
<f:facet name="header">
<a4j:status id="ajaxTabStatus" name="ajaxTabStatus">
<f:facet name="start">
<h:outputText value="Loading..." />
</f:facet>
<f:facet name="stop">
<h:outputText value="Ajax Tab" />
</f:facet>
</a4j:status>
</f:facet>
<h:outputText value="#{bean.value}" />
</rich:tab>
更新 2:
我还找到了另一种方法,使用onbegin
和oncomplete
属性与一些代码,如:
<rich:tab id="ajaxTab" switchType="ajax"
onbegin="#{rich:component('ajaxTab')}.?"
oncomplete="#{rich:component('ajaxTab')}.?">
好吧,如您所见,我还没有找到一种方法来操作选项卡标题(而且我没有找到任何有用的文档来说明我可以使用rich:component 做什么)。