【问题标题】:Can't update p:tab content无法更新 p:tab 内容
【发布时间】:2017-05-15 15:50:41
【问题描述】:

我正在尝试更新选定选项卡的内容,但似乎没有任何方法有效。

我有这种东西:

<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>

线:

&lt;p:poll interval="60" update=":tabsForm:tabs" oncomplete="doSomething()"/&gt;

假设每 60 秒更新每个选项卡内的内容,问题是,它总是会选择update 之后的第一个选项卡。

我尝试通过这种方式单独更新标签:

&lt;p:poll interval="60" update=":tabsForm:tabs:version" oncomplete="doSomething()"/&gt;

但我得到一个例外:

在没有附加渲染器的情况下,无法更新 ID 为“tabsForm:tabs:0:version”的组件“org.primefaces.component.tabview.Tab”。从“tabsForm:tabs:0:j_idt14”引用的表达式“:tabsForm:tabs:version”

我还从我在 SO 上找到的问题中尝试了很多其他方法,但没有任何效果。 它要么更新并为我选择第一个选项卡,要么根本不更新。

【问题讨论】:

  • 您是否尝试将要更新的内容包装在 ui:fragment 中,给它一个 id 并更新它?如果不是,为什么不呢?如果你做了什么问题?
  • 如果您需要在更新所有选项卡后保持所选选项卡处于打开状态,Stackoverflow 中至少有两个类似的问题:google.com/…
  • update="version" 不能解决您的问题吗?
  • @TheBitman:那也行不通...p:tab 没有渲染器,因此无法更新。您很可能会遇到与问题相同的错误。
  • 正如@kukeltje 所说:选项卡组件没有渲染器,因此您应该将 activeIndex 绑定到 bean 属性以在 tabview 更新时显示正确的选项卡

标签: ajax jsf primefaces


【解决方案1】:

我认为您不想将标签放在动态 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();
}

在主页面中:

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

我删除了“dynamic=true”(似乎会导致更多问题)。通过侦听器从支持 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

【讨论】:

  • 您有类似或相同的问题吗?由于您无法更新单个选项卡...您更新代码中的所有选项卡。这样可行。但这不是 OP 要求的。
  • 确定刚刚更新了这个标签的内容吗?你用的是什么PF版本?里面的一些“自动更新”组件是不是也被“意外”更新了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多