根据数据属性有条件地隐藏数据表列

Conditionally hide datatable column based on data-attribute

我有以下问题:

我想有条件地显示数据表中的列。特别是 kt-datatable 中的操作列。 (Laravel 的 Metronic 主题有它自己的基于 jQuery 数据表的 Datatables 实现。)我一直在研究 column.render 方法,但我不能完全理解它。理想情况下,我想显示一个基于我传递的数据属性的列以及数据表的 html。

HTML:

<div id="datatable-example" data-isadmin="{{ auth()->user()->hasRole(['superadmin', 'admin']) }}"></div>

js/jquery:

example_datatable = example_element.DataTable({
        search: {
            input: $('#generalSearch'),
        },
        rows: {
            ...
        },
        columns: [
            ...,
            {
                field: 'actions',
                title: sendings_element.data('column-actions'),
                class: 'w8',
                textAlign: 'right',
                sortable: false,
                template: function (row) {
                    if (sendings_element.data('user_roles')) {
                        return '<a class="btn btn-danger" href="' + sendings_element.data('route-edit-sending').replace('__id__', row.id) + '">' + sendings_element.data('text_edit') + '</a>';
                    } else {
                        return '<a class="btn btn-danger" href="' + sendings_element.data('route-view-sending').replace('__id__', row.id) + '">' + sendings_element.data('text_view') + '</a>';
                    }
                }
            },
        ],
    });

对此我真的很感激。

更新:

我找到了一个可行的解决方案:

<div id="datatable-id"
         ...
         data-isadmin="{{ auth()->user()->hasRole('super-admin') ? "true"  : "false" }}" 
    ></div>

在我的 javascript:

 kb_datatable = kb_element.customDataTableThatExtendsKTDatatable({      
        ...    
        columns: [          
           ...
            {
                field: 'description',
                title: kb_element.data('column-description'),
                width: 600,
                template: function(row) {
                    if(kb_element.data('isadmin')){                     
                        kb_datatable.column(1).visible(false);
                    }
                },
            },           
            ...

            },
        ],
    });

我对解决方案还不满意,因为我正在使用行模板来隐藏列。但目前有效。

@remul:是的,我正在使用 KT-Datatable,我不确定我的同事在他的代码中报告了这个问题。接得好!我刚刚使用扩展 ktdatatable 的自定义数据表设置了一个测试用例。我已经接受了你的答案作为解决方案,因为你指出了我正确的方向,但事情是可见的 属性 期望 true 或 false,因此 html 代码中的缩写。理想情况下,我希望该列有一个回调函数,但我唯一能找到的是模板方法。此外,如果我在列对象 i 运行 中的可见 属性 上使用 shortif 的结果会导致一个奇怪的错误,我需要将其他列设置为 null 并且无法为其他列设置其他属性列。将 ColumnDefs 与 target 和 visible 一起使用是另一种解决方案,但我也无法做到这一点。

visible 属性添加到 actions 列应该可以解决问题,但是当使用 stateSave 时,只要数据表存在已保存状态,更改数据属性就不会产生任何影响。为避免这种情况,您可以删除状态保存的可见性,如前所述 here:

If you want to not state save column visibility you could remove the visible parameter from the columns array of objects in the state object:

stateSaveParams: function ( settings, data ) {
  for ( var i=0, ien=data.columns.length ; i<ien ; i++ ) {
    delete data.columns[i].visible;
  }
}

所以在你的情况下:

columns: [
    {
        field: 'actions',
        visible: !!example_element.data('isadmin')
        // your other attributes
    },
],
stateSaveParams: function ( settings, data ) {
    for ( var i=0, ien=data.columns.length ; i<ien ; i++ ) {
        delete data.columns[i].visible;
    }
}