【问题标题】:Primefaces update only selected tabPrimefaces 仅更新选定的选项卡
【发布时间】:2014-09-15 19:16:56
【问题描述】:

我有一种情况,我想在触发“选择”事件时更新页面上的多个组件。 然而,其中两个位置位于 tabView 中,如果它们位于当前选定的选项卡中,我只想更新这些组件。我怀疑我正在寻找的东西是这样的......

<p:ajax event="select" 
        update="@(<don't know what to put here> .ui-tabs-selected)" 
        listener="#{treeSelectionView.onNodeSelect}" />

但我不确定。

我尝试的另一种策略只是使 tabView 动态 =“true”,但是当我从 p:ajax 标记调用更新时,即使未选择选项卡,它也会提取数据。 :(

我是 Primefaces 的新手,并且喜欢我目前所看到的内容。这似乎不应该太难,但我不知何故错过了这个标记。此外,我很难找到对我有帮助的文档或示例。希望我只是在错误的地方寻找。 :)

提前致谢。

【问题讨论】:

    标签: jquery jsf primefaces


    【解决方案1】:

    简而言之,@(...) 语法转换为 jQuery 选择器,它应该返回 JSF 生成的具有具体 id 属性的 HTML 元素。更长的解释可以在这个问题的答案中找到:How do PrimeFaces Selectors as in update="@(.myClass)" work?

    您与.ui-tabs-selected 关系密切,但它只指向选项卡本身(选项卡视图顶部的标签),而不是具有.ui-tabs-panel 类的选项卡面板(所选选项卡的实际内容)。正确的 jQuery 选择器是这个,使用 :visible pseudoselector:

    update="@(.ui-tabs-panel:visible)"
    

    但是,我只是在这里尝试过,它在当前 PF5 版本中存在渲染错误。整个&lt;div class="ui-tabs-panel"&gt; 本身被替换为唯一的选项卡内容,而不是仅替换其内容。当我将选项卡的内容包装在另一个 &lt;h:panelGroup&gt; 中时它起作用了,它有一个像这样的通用样式类:

    <p:tabView>
        <p:tab title="one">
            <h:panelGroup id="one" styleClass="tab-content">
                ...
            </h:panelGroup>
        </p:tab>
        <p:tab title="two">
            <h:panelGroup id="two" styleClass="tab-content">
                ...
            </h:panelGroup>
        </p:tab>
        <p:tab title="three">
            <h:panelGroup id="three" styleClass="tab-content">
                ...
            </h:panelGroup>
        </p:tab>
    </p:tabView>
    

    然后可以如下引用:

    update="@(.ui-tabs-panel:visible .tab-content)"
    

    请注意,出于第一段中提到的原因,您确实需要给那些&lt;h:panelGroup&gt;s 一个固定的id

    【讨论】:

    • 完美!谢谢BalusC。这正是我想要的。
    • BalusC,我认为这对我有用,但经过进一步测试,事实并非如此。有两种方法看起来不像我期望的那样工作。首先,每次触发该事件时都会提取数据,无论选择了 4 个选项卡中的哪一个。预期的行为将是仅提取当前选定选项卡中所需的数据。其次,即使事件本身只被触发一次,数据也会被多次拉取。您还有其他建议吗?
    • 没有。侦听器只被调用一次,但填充 panelGroup(准确地说是一个数据表)所需的数据被拉取多次。似乎update= 导致数据被多次检索,而不是我期望的 one 时间(因为只选择了一个选项卡)。此外,该事件由在页面上选择的 TreeNode 触发。我认为事件的来源并不重要,而且我认为该事件运行良好。如果我指定update=":myPanelGroup",更新只会发生一次。当我使用上面的@() 时,它会发生很多次。
    • 页面上有 4 个选项卡和一棵树。当树中的一个节点被选中时,它会改变页面的上下文。这意味着应该更新始终在视图中的区域,并且还应该更新选项卡中的两个表,但前提是它们位于当前选定的选项卡中。事实上,即使未选择相应的选项卡,表格也会更新。
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多