7

我试图达到的目标

我有一个rich:tabPanelwithswitchType="client"并且其中一个选项卡已将其设置为switchTypeajax因为加载其数据是一项昂贵的操作。当我单击此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:

我还找到了另一种方法,使用onbeginoncomplete属性与一些代码,如:

<rich:tab id="ajaxTab" switchType="ajax"
    onbegin="#{rich:component('ajaxTab')}.?"
    oncomplete="#{rich:component('ajaxTab')}.?">

好吧,如您所见,我还没有找到一种方法来操作选项卡标题(而且我没有找到任何有用的文档来说明我可以使用rich:component 做什么)。

4

2 回答 2

1

我不是很熟悉RichFaces 4.x。然而,这是如何做到这一点RichFaces 3
假设这是你tabPanel

<h:form>
  <rich:tabPanel>
    <rich:tab label="Client Tab" switchType="client">
      Tab - client
    </rich:tab>

    <rich:tab label="Ajax Tab" id="ajaxTab" switchType="ajax" ontabenter="changeLabel(event)">
      <h:outputText value="#{bean.value}" />
    </rich:tab>
  </rich:tabPanel>
</h:form>

请注意ontabenterajax 选项卡中的事件。

现在你的脚本会是这样的。

<script>
    function changeLabel(tabId) {
        var tabLabel = event.target || event.srcElement;
        tabLabel.innerHTML = 'Loading...';
    }
</script>

我不太了解RF4。但是,RF3不需要将oncomplete事件添加到选项卡。

于 2012-11-27T05:07:07.150 回答
1

我用richfaces 4.3.7 做下面的代码。它似乎工作。(我显示加载面板而不是修改选项卡标题。)

<a4j:status oncomplete="#{rich:component('busy')}.hide()"
    onerror="#{rich:component('busy')}.hide()"
    onbegin="#{rich:component('busy')}.show()">
    <rich:popupPanel id="busy" modal="true" moveable="false"
        resizeable="false" autosized="true">
        <h:panelGrid styleClass="alignCenter" width="100%" id="busyPanel"
            columns="1" border="0" cellpadding="0" cellspacing="2">
            <h:outputLabel value="Loading..." />
        </h:panelGrid>
    </rich:popupPanel>
</a4j:status>
<h:form>
    <rich:tabPanel switchType="ajax" 
        oncomplete="#{rich:component('busy')}.hide()" 
        onerror="#{rich:component('busy')}.hide()"
        onbegin="#{rich:component('busy')}.show()"
        >
        <rich:tab label="Client Tab" switchType="client">
          Tab - client
        </rich:tab>

        <rich:tab label="Ajax Tab" id="ajaxTab" >
          <h:outputText value="#{bean.value}" />
        </rich:tab>
    </rich:tabPanel>
</h:form>
于 2015-05-08T21:39:16.610 回答