Yii2 Gridview获取所有分页的所有选定行

Yii2 Gridview获取所有分页的所有选定行,yii,yii2,Yii,Yii2,我用Pjax小部件包装了gridview,如下所示 \yii\widgets\Pjax::begin(); gridview \yii\widgets\Pjax::end(); 为了使gridview在单击每个分页时发出ajax请求 我还在列中使用['class'=>'yii\grid\CheckboxColumn'],。 我发现当我第一次分页时,我检查了一些行,然后转到第二页,检查了一些行,但当我回到第一页时,我检查的内容就消失了。 我的问题是,在当前条件下(Pjax,多页,y

我用Pjax小部件包装了gridview,如下所示

 \yii\widgets\Pjax::begin();
    gridview
 \yii\widgets\Pjax::end(); 
为了使gridview在单击每个分页时发出ajax请求

我还在列中使用
['class'=>'yii\grid\CheckboxColumn'],
。 我发现当我第一次分页时,我检查了一些行,然后转到第二页,检查了一些行,但当我回到第一页时,我检查的内容就消失了。 我的问题是,在当前条件下(Pjax,多页,
yii\grid\CheckboxColumn
),如何保持所有分页的所有checkedrow?这是不可能的,因为它的工作方式

当您单击分页链接时,所有
GridView
html内容都将被来自AJAX响应的新内容替换

很明显,上一页上所有选中的复选框都消失了

有几种可能的解决方法:

1)编写自定义javascript和服务器端逻辑

作为选项之一,您可以向服务器发送AJAX请求,参数表示用户已选择为批量删除操作选择所有数据(或使用单独的控制器操作进行批量删除)。在这种情况下,实际上我们不需要从用户那里获取所选的数据,因为我们只需要从数据库(credits-)获取它们

2)增加每页显示的行数

3)例如,使用无限滚动扩展

4)在多次迭代中中断所需操作:

  • 在第一页上选择所需的行,执行操作(例如,删除)
  • 对其他页面重复此操作
您可以获得如下所示的选定行:

$('#your-grid-view').yiiGridView('getSelectedRows');

我刚刚解决了这个问题,它可以与Pjax一起正常工作

您可以使用我的复选框列。我希望这能有所帮助。已检查的项目用cookie记录

您可以阅读带有//add by hezll的部分,了解如何修复它,因为我没有提供完整的通用部分

希望对你有用

[infinite scroll]:如果没有任何pjax过滤器,它将很好地工作。如果你也有过滤器,不要使用这个插件,因为它不支持pjax过滤器。对于其余的应用程序,它非常适合使用

更新1:这似乎比预期的要直接,以下是我是如何做到这一点的

在复选框列中添加以下行

'checkboxOptions' => function($data){
                        return ['id' => $data->id, 'onClick' => 'selectedRow(this)'];
                    }
现在,将以下JS添加到这个datagrid所在页面的项目中的公共JS文件中

var selectedItems=[]; //global variable
/**
 * Store the value of the selected row or delete it if it is unselected
 * 
 * @param {checkbox} ele 
 */
function selectedRow(ele){
    if($(ele).is(':checked')) {
        //push the element
        if(!selectedItems.includes($(ele).attr('id'))) {
            selectedItems.push($(ele).attr('id'));
        }
    } else {
        //pop the element
        if(selectedItems.includes($(ele).attr('id'))) {
            selectedItems.pop($(ele).attr('id'));
        }
    }
}
上述函数将所选行ID存储在全局变量数组中

现在将以下行添加到pjax:end事件处理程序

$(document).on('pjax:end', function () {
    //Select the already selected items on the grid view
    if(!empty(selectedItems)){
        $.each(selectedItems, function (index,value) {
            $("#"+value).attr('checked',true);
        });
    }
});

希望有帮助。

您能告诉我在单击分页后如何自定义pjax事件上的代码吗?太宽了。像这样的问题(“为我写代码”)不受欢迎。尝试一些东西,至少添加一些草稿。但我建议使用我描述的替代方法(无限滚动或分步)。谢谢,我现在知道怎么做了。很高兴能提供帮助。如果有帮助,你也可以投票。为什么你认为这是不可能的?为什么不简单地将数据传递给用户选择为批量操作全选的服务器呢。当选择“全部”时,我们不需要从用户处获取所选数据,但我们可以简单地从数据库中获取它们。正确的?