无法更新p:标签内容

时间:2017-05-15 15:50:42

标签: ajax jsf primefaces

我试图更新所选标签的内容,但似乎没有方法可行。

这就是我所拥有的:

<h:form id="tabsForm">

    <p:tabView id="tabs"
               dynamic="true"
               cache="false"
               value="#{mainPage.versions}"
               var="version"
               scrollable="true">

        <p:ajax event="tabChange" listener="#{mainPage.onTabChange}" />
        <p:ajax event="tabClose" listener="#{mainPage.onTabClose}" />

        <p:tab id="version" title="#{version.value}" closable="true">

          <p:poll interval="5" update=":tabsForm:tabs" oncomplete="doSomething()"/>

          CONTENT GOES HERE (ALSO NEEDS TO BE UPDATED)

        </p:tab>

    </p:tabView>

</h:form>

The Line:

<p:poll interval="60" update=":tabsForm:tabs" oncomplete="doSomething()"/>

假设每隔60秒更新一个标签内的内容,问题是,它将始终选择update之后的第一个标签。

我尝试单独更新标签,这样:

<p:poll interval="60" update=":tabsForm:tabs:version" oncomplete="doSomething()"/>

但我得到一个例外:

  

无法更新组件&#34; org.primefaces.component.tabview.Tab&#34; with id&#34; tabsForm:tabs:0:version&#34;没有附加的渲染器。 Expression&#34 ;: tabsForm:tabs:version&#34;引自&#34; tabsForm:tabs:0:j_idt14&#34;

我也尝试了很多其他方法,我在SO上找到的问题,但没有任何工作。 它会为我更新并选择第一个标签,或者根本不更新。

1 个答案:

答案 0 :(得分:0)

我不认为你想把标签放在动态tabView中。这将为每个单独的选项卡创建一个轮询。相反,您希望使用一个轮询标记来更新选项卡。如果您可以更新所有选项卡并将焦点保持在当前选项卡上,那么只需..

<h:form id="tabsForm">

    <p:tabView id="tabs"
           cache="false"
           value="#{mainPage.versions}"
           var="version"
           scrollable="true">

      <p:ajax event="tabChange" listener="#{mainPage.onTabChange}" />
      <p:ajax event="tabClose" listener="#{mainPage.onTabClose}" />

      <p:tab id="version" title="#{version.value}" closable="true">

        CONTENT GOES HERE (ALSO NEEDS TO BE UPDATED)

      </p:tab>

    </p:tabView>
    <p:poll interval="60" listener="#{mainPage.updateComponent('tabsForm:tabs:version')}" oncomplete="doSomething();"/>

</h:form>

在javascript中

//if this is needed ***
function doSomething() { 
    $("#tabsForm\\:tabs ul li.ui-tabs-selected).click();
}

并在mainPage中:

public void updateComponent(String compId){
     RequestContext.getCurrentInstance().update(compId);
}

我删除了&#34; dynamic = true&#34; (似乎会导致更多问题)。通过侦听器更新支持bean中的组件来消除错误消息。

更新单个标签更加困难,容易出现奇怪的行为。您可以尝试,但它似乎只有在tabIndex不为0时才有效。您将使用

捕获tabIndex onTabChange事件
public void onTabChange(TabChangeEvent event) {
    tabIndex = ((TabView) event.getSource()).getIndex();
}
//getter setter tabIndex

你的民意调查标签就像是

<p:poll interval="60" listener="#{mainPage.updateComponent('tabsForm:tabs:' += mainPage.tabIndex += ':version')}" oncomplete="doSomething();"/>

显然+ =仅适用于EL 3.0,您可以使用.concat。我的PF版本是6.0