【问题标题】:Identify when the selected row in the table is already selected识别表中的选定行何时已被选中
【发布时间】:2014-12-04 07:34:30
【问题描述】:

我在 primefaces 中有一个 p:datatable,我有不同的侦听器,用于在数据表中选择行事件的不同方式。

我需要确定表格中所选行何时已被选中,我该怎么做?

我需要这个,因为当我在已选择的表中选择行时,我不希望 p:blockUI 运行。

有我的页面代码:

...
<pe:blockUI autoShow="true" 
            source="itemsDT" 
            event="rowSelect" 
            target=":processTab">
    <au:loading />                                    
</pe:blockUI>
<p:dataTable widgetVar="processesTable" 
             id="itemsDT" 
             var="item" 
             value="    
             {tasksbacking2.availableProcesses}" 
             selection="#{tasksbacking2.selectedProcess}" 
             rowKey="#{item.id}"
             tableStyleClass="table
             table-condensed table-bordered"   
             resizableColumns="true">

    <p:ajax event="rowSelect" 
            listener="#{tasksbacking2.onClickFillDetails}" 
            update="@this,:processTab,:menuForm:menuBar" />
    ...
</p:dataTable>
...

在托管 bean 上我有这个监听器:

...
public void onClickFillDetails(SelectEvent event) {
      AnoProcess clickedProcess = (AnoProcess) event.getObject();
      setSelectedProcess(clickedProcess);
      Movement currentMovement = this.getProcessesLastMovement().get(clickedProcess);
      if (currentMovement != null && !currentMovement.isViewed()) {
            markAsRead(processes);
      }
   ...
}

【问题讨论】:

  • 您使用的是 primefaces 5.1 吗?或者你能告诉你的primefaces lib版本吗?因为我看不到您在 `p:blockUI 上使用的某些属性,或者您正在使用其他组件?
  • 我使用 primefaces 5.0 并使用 primefaces-extensions(用于带有事件捕获的 blockUI)。看到这个primefaces.org/showcase-ext/views/…
  • 哦,好的。您可以使用RequestContext 解决此问题,并在新选择的项目与上次选择的项目不同时运行pe:blockUI
  • 你能把五月的版本替换为p:blockUIpe:blockUI 请,是我的错误。
  • 改变上下文不是解决办法。是的,我再次编辑。我的解决方案可能在 p:ajax 中的 onstart 事件中,如下所示:

标签: jsf-2 primefaces primefaces-extensions


【解决方案1】:

我认为你需要的是 js 中的一些函数,并在 onstart 中应用它。

这样

<p:ajax event="rowSelect" onstart="???" />

【讨论】:

    【解决方案2】:

    这是检查同一行是否重复点击的脚本。
    将此脚本放在您的p:dataTable 代码下方。

    <script type="text/javascript">
        var prevRow ;
        function checkDupRowClick(){
            var currRow = $('tr.ui-widget-content.ui-datatable-selectable[aria-selected="true"]');
            if($(currRow).is($(prevRow))){
                //selected or clicked same row so return FALSE to prevent p:ajax from executing
                return false;
            }else{
                //selected or clicked different row so return TRUE to allow p:ajax to execute
                prevRow = currRow;
                return true;
            } 
        }
    </script>
    

    AND 使用函数作为p:ajax 的返回参数

    <p:ajax event="rowSelect" onstart="return checkDupRowClick();" />
    

    如果您需要更多解释,请发表评论。

    【讨论】:

    • 这个脚本工作。但是当返回 false 时,页面无法正常工作。为什么?我的 p:ajax 是:
    • 有没有JS控制台错误?您的页面上有多少个表格?
    • 2 个表,但我知道这一点并将脚本更改为:var prevRow;函数 checkDupRowClick() { var currRow = $('#formDTItems tr.ui-widget-content.ui-datatable-selectable[aria-selected="true"]'); if ($(currRow).is($(prevRow)) { return false; } else { prevRow = currRow; return true; } }
    猜你喜欢
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2012-06-06
    • 2016-09-27
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多