如何访问数据表库单表中其他json对象的值?

Posted

技术标签:

【中文标题】如何访问数据表库单表中其他json对象的值?【英文标题】:How to access values of other json objects in single table of datatable library? 【发布时间】:2019-11-25 17:06:53 【问题描述】:

我正在尝试使用数据表显示数据和查看/编辑/删除按钮。

我正在使用这样的两个对象获取用户数据和权限: ]


    "data": [
        
            "userid": "1",
            "username": "John",
            "email": "john@gmail.com",
            "userrole": "SYSTEM VENDOR",
            "isactive": "Y",
            "activationstat": "deactivate",
            "activationmsg": "Deactivate"
        
    ],
    "perm": 
    
        "read": "y",
        "edit": "y",
        "delete": "n"
    

需要为每一行呈现按钮。数据表代码如下:

$('#dt-user').DataTable(
    dom: 'lBfrtip',
    buttons: [
        
            extend: 'copyhtml5',
            exportOptions: 
                columns: ':visible'
            
        ,
        
            extend: 'csvHtml5',
            exportOptions: 
                columns: ':visible'
            
        ,
        
            extend: 'excelHtml5',
            exportOptions: 
                columns: ':visible'
            
        ,
        
            extend: 'pdfHtml5',
            exportOptions: 
                columns: ':visible'
            
        ,
        
            extend: 'print',
            exportOptions: 
                columns: ':visible'
            
        ,
        'colvis'
    ],
    ajax: baseURL + 'user/list-user-aj',
    columns: [
        
            "data": "id",
            render: function (data, type, row, meta) 
                return meta.row + meta.settings._iDisplayStart + 1;
            
        ,
         data: 'username' ,
         data: 'email' ,
         data: 'userrole' ,
         data: 'isactive' 
    ],
    responsive: 
        details: false
    
);

如何访问“perm”JSON 对象以检查其值以显示编辑、删除、打印等按钮?

【问题讨论】:

请把代码放在帖子里,不要截图。 您是否尝试在控制台中登录列回调的其他参数?喜欢console.log(data, type, row, meta)?也许其中一些字段可能包含您需要的信息。 是的,我做到了。我只能访问用户信息(数据)。 欢迎来到 Stack Overflow。请提供一个最小的、可重复的示例:***.com/help/minimal-reproducible-example 【参考方案1】:

简短回答:您将无法在数据表初始化代码中获取“perm”对象。数据表初始化代码仅适用于 JSON 中的“数据”数组。

但是,对于您的情况,这里有两种可能的解决方案:

选项 1: 如果“perm”对象对 JSON 中“data”数组中的所有元素(用户)是通用的,如下所示:


    "data": [
    
        "userid": "1",
        "username": "John",
        "email": "john@gmail.com",
        "userrole": "SYSTEM VENDOR",
        "isactive": "Y",
        "activationstat": "deactivate",
        "activationmsg": "Deactivate"
    ,
    
        "userid": "2",
        "username": "John2",
        "email": "john2@gmail.com",
        "userrole": "SYSTEM VENDOR2",
        "isactive": "Y",
        "activationstat": "deactivate",
        "activationmsg": "Deactivate"
    
    <!-- and maybe some more objects-->
   ],
  "perm": 
   
    "read": "y",
    "edit": "y",
    "delete": "n"
   

然后您可以访问 perm 对象,如下所示:(这将在 Datatables 定义之外)

var permissions;
userDatatable.on('xhr', function () 
    var json = userDatatable.ajax.json();
    var permissions = json.perm;

);

当您初始化 Datatables 时,userDatatable 将是全局 javascript 变量,如下所示:

var userDatatable = $('#dt-user').DataTable(  //......and all your code 

然后在你的列定义中,你可以像这样访问 perm 对象和渲染按钮:

 columns:[
    
      data:null,
      "render": function(data, type, row, meta)
         if(perm.delete === 'y')
             return "<button class='deleteButton'> Delete </button>";
         
      
    
 ]

确保 javascript 变量“permissions”是全局的并且对您的 Datatables 初始化代码可见。这将为您提供删除按钮,但您必须编写额外的 Javascript/JQuery 代码来触发数据表编辑器的 AJAX 调用来删除行;无论是在后端还是从网格中。

选项 2:您可以修改服务器端代码以返回 JSON,使其在“data”数组的每个元素中都具有权限对象:


    "data": [
    
        "userid": "1",
        "username": "John",
        "email": "john@gmail.com",
        "userrole": "SYSTEM VENDOR",
        "isactive": "Y",
        "activationstat": "deactivate",
        "activationmsg": "Deactivate",
        "perm": 
          
            "read": "y",
            "edit": "y",
            "delete": "n"
           
    ,
    
        "userid": "2",
        "username": "John2",
        "email": "john2@gmail.com",
        "userrole": "SYSTEM VENDOR2",
        "isactive": "Y",
        "activationstat": "deactivate",
        "activationmsg": "Deactivate",
         "perm": 
           
             "read": "y",
             "edit": "y",
             "delete": "n"
           
    
    <!-- and maybe some more objects-->
   ]

使用第二个选项,您可以使用“row.perm.delete”属性在“render”函数中访问 perm 对象。

希望对您有所帮助!

【讨论】:

在选项 1 中,在设置权限变量数据表的值之前,必须初始化数据表,并且渲染列的代码也在初始化中。在这种情况下,有一个错误“权限”变量未声明。我将权限和 userDatatable 声明为全局。 (如果我先初始化表,然后初始化权限,销毁表,然后再次初始化数据表,它就可以工作)。 你是对的。只有在 Datatables AJAX 调用完成后,“权限”变量才可用。还有一种方法可以将 AJAX 调用与 Datatables 初始化代码分开。因此,您首先进行 AJAX 调用,将数据存储在 javascript 对象中,然后通过“data”选项将 javascript 对象的“data”部分作为数据提供给 Datatables。这样您就可以避免销毁表并重新初始化。 莫妮卡 L 非常感谢。有效。 (而且我已经停止使用数据表)。 :))))

以上是关于如何访问数据表库单表中其他json对象的值?的主要内容,如果未能解决你的问题,请参考以下文章

面试官系列,深入数据库分区分库分表

面试官系列,深入数据库分区分库分表

MySQL 整库单表备份 for python脚本

node.js+mysql实现分库分表存查数据:

Mysql如何不停机迁移到分库分表

什么是分布式事务?