【问题标题】:how to get selected records count in rich data table having multiple pages rich:datascroller如何在具有多页丰富的丰富数据表中获取选定记录计数:datascroller
【发布时间】:2014-04-10 09:32:07
【问题描述】:

我面临一个问题,我想测试用户是否从rich:dataTable 的多个页面中选择了任何记录。这些页面是通过rich:datascroller 创建的。相关代码如下。

            <rich:datascroller id="dataScroller" selectedStyleClass="myClass" renderIfSinglePage="false"
                align="center" for="dataList" maxPages="10" 
                 pageIndexVar="currentPage" pagesVar="totalPages" reRender="pageNum,dataList" ajaxSingle="false">
                <f:facet name="first"><h:outputText value="First" /></f:facet>
                <f:facet name="last"><h:outputText value="Last" /></f:facet>
            </rich:datascroller>
            <h:inputHidden id="pageNum" value="#{currentPage}"></h:inputHidden> 
            <h:inputHidden id="numOfRows" value="10"></h:inputHidden>

问题在于,如果用户选择了一条记录(比如在第 3 页),然后他移至第一页。现在在这种情况下,当我尝试遍历 Java Script 中的表以知道他是否选择了任何记录时,它总是允许我迭代直到我所在的当前页面,因此我无法给用户正确的警报消息,用于在按下提交按钮时首先选择记录。我只想知道用户已根据可用页面中任何页面上的记录选中复选框,而不管当前在哪个页面上打开。有什么想法吗?

【问题讨论】:

  • 如果用户离开了,那么你应该把它当作他没有选择任何东西,不是吗?
  • 不,我只想在他在所有页面上完成选择后按下提交按钮时才向他显示警报消息
  • 我不明白,你能给我一个用例吗?用户来到桌子旁,他在做什么? (或者你想让用户做什么?)
  • 实际上我拥有这个 Rich:dataTable 的页面也有许多其他字段,但是从 Rich:dataTable 中的可用记录中选择一条记录是成功持久化更改所必需的。现在,如果用户已完成所有强制性工作,但尚未从 rich:dataTable 中选择记录并按下提交按钮,在这种情况下,我会向他显示您忘记从表中选择记录的警报消息。现在由于该页面包含多个页面(由于使用rich:datascroller),用户可以选择可用页面上的任何记录并按下提交按钮。

标签: jsf richfaces


【解决方案1】:

通过Richfaces Javascript API尝试。

对于页面中的每个组件,都有一个代表 Javascript 对象,命名为 next: Richfaces_componentId(小“f”代表面孔)。 使用它并实时了解它,转到ScrollableDatatable Live Demo,打开您的 chrome 浏览器控制台,然后执行以下命令:

 Richfaces_ScrollableGrid_j_id353_carList.selectionManager.selection.ranges

这将打印出一个空的 javascript 数组。 尝试选择一些行,然后再次运行该行,您将拥有一个包含所选行索引的数组。

所以把它放在一个函数中:

<script>
    function tableHasSelection() {
         return Richfaces_ScrollableGrid_j_id353_carList.selectionManager.selection.ranges.length != 0;
    }
</script>

现在您通过提交按钮的onclick 调用此函数,如果没有选择阻止提交,则通过return false 调用此函数。 当然,您可以将 Richfaces_ScrollableGrid_j_id353_carList 替换为组件的 javascript 表示对象。 希望这会有所帮助。

[更新]

根据我们在 cmets 中的讨论,这里有一个可能会有所帮助的更新。 你的数据表应该是这样的:

<rich:extendedDataTable value="..." var="element" id="table" selectionMode="..." selection="...">
     <rich:column>
         <h:selectBooleanCheckbox value="..." onclick="toggleSelection(this, #{element.id});" />
     </rich:column>
</rich:extendedDataTable>
<h:commandButton value="Submit" action="#{...}" onclick="return tableHasSelection();" />

您的脚本将具有以下功能:

<script>
    var selectedElements = [];
    function toggleSelection(checkbox, id) {
         if ($(checkbox).is(':checked')) {
             //add selected row if checkbox is checked
             selectedElements.push(id);
         } else {
             //or find it in the array and remove it
             var index = selectedElements.indexOf(id);
             if (index > -1) {
                 array.splice(index, 1);
             }
         }
    }

    function tableHasSelection() {
         return selectedElements.length != 0;
    }
</script>

【讨论】:

  • Qussay 感谢您抽出宝贵时间...但我的问题是我想根据表格中每一行的复选框再次做出决定。 Rich:dataTable 中所有可用行和所有页面中的任何复选框都被选中,然后我将保留所有选中的记录,但如果用户没有选中所有页面上的任何复选框,则我必须向他显示警报消息。 ..我正在使用 rich:dataTable 并且必须坚持使用它...
  • 好的,然后我将创建一个全局范围的 javascript 数组,并在每个复选框选择时向其中添加选定的元素,并在提交时检查该数组的长度。
  • @QussayNajjar 文档和演示适用于 RF 3.3.x,它在 RF 4 中不起作用
  • @bilal 我已经根据您的评论更新了答案,老实说,作为一个验证解决方案,我发现这是最优化的解决方案。如果仍然不能解决您的问题,请告诉我
  • Qussay...谢谢你的时间。这就是我想要的,它解决了我的问题。
【解决方案2】:

&lt;rich:extendedDataTable&gt; 有可选择的行,你可能想看看)

您可以做的一件事是在用户单击时提交选择。例如

<h:selectBooleanCheckbox onclick="saveSelection(#{rowId})">

…
<a4j:jsFunction name="saveSelection">
    <a4j:param name="id" assignTo="#{bean.selectedId}">
</a4j:jsFunction>

但如果用户只选择一行,那么简单地说,如果所选行不在当前页面上,则用户没有选择任何内容,我不认为这是错误的方法。

【讨论】:

  • @Makhiel .... 在您的方法中,我们将始终在每个复选框选择上都有服务器跳闸,因为用户可以选择他想要的尽可能多的记录...所以它的性能和成本会有点高我正在做所有这些来提高性能.....
  • 如果您希望在多个页面上进行多个选择,那么我不确定使用分页是正确的方法。关键是您必须使用一个额外的字段来“记住”用户选择的内容,它可以是一个隐藏的输入字段,这样您就不必与服务器交谈。
猜你喜欢
  • 2011-10-14
  • 1970-01-01
  • 2011-02-11
  • 2014-07-09
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2022-06-12
相关资源
最近更新 更多