【问题标题】:RichFaces tabPanel with switchType ajax and a4j:statusRichFaces tabPanel 与 switchType ajax 和 a4j:status
【发布时间】:2012-09-22 08:15:06
【问题描述】:

我想达到的目标

我有一个rich:tabPanelswitchType="client",其中一个选项卡已将其switchType 设置为ajax,因为加载其数据是一项昂贵的操作。当我单击此 Ajax 选项卡 时,我希望将其标题更改为 Loading... 以表明单击已被识别。完成加载后,标题应切换回 Ajax 选项卡

[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 版以来已得到修复。此外,我用谷歌搜索了几个小时,但找不到任何类似的问题。

环境

  • Tomcat 7.0.30
  • Mojarra 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:

我发现a4j:status 的标识符(我的意思是您指定的标识符,如&lt;rich:someTag ... status="someStatus" /&gt;)不是它的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 做什么)。

【问题讨论】:

    标签: jsf-2 richfaces ajax4jsf


    【解决方案1】:

    我对@9​​87654321@不是很熟悉。但是,这是在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>
    

    注意 ajax 选项卡中的 ontabenter 事件。

    现在你的脚本应该是这样的。

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

    我对@9​​87654327@ 了解不多。但是在RF3 中,不需要将oncomplete 事件添加到选项卡。

    【讨论】:

      【解决方案2】:

      我使用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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 2011-05-23
        • 2013-04-15
        相关资源
        最近更新 更多