【问题标题】:Data tree with dynamic data and topCalc具有动态数据和 topCalc 的数据树
【发布时间】:2022-01-07 07:41:27
【问题描述】:

在制表符中,我试图让一些东西很好地结合在一起。我已经接近一个可行的解决方案,但新问题不断出现。一些帮助肯定会很感激!

我有一些数据,当我试图显示一个数据树时,我已经为它定义了一些子节点。

我想要实现的是在父行中显示一些聚合数据。数据包含在子项中。在我的示例中更具体地说:我希望父行显示总视图,而子行显示某个特定日期的视图。

问题不大。当我尝试在这个特定挑战的方程式中添加一个 topCalc 和过滤器时,麻烦就开始了。

代码如下所示:

Fiddle.

let tabledata = [
    {id:1, isParent: true, title:"Making sense", date:"01/02/2016", _children:[
       {date:"01/02/2016", title:"Making sense 1", views: 204},
       {date:"07/02/2017", title:"Making sense 2", views: 21},
    ]},
    {id:1, isParent: true, title:"Restoring sanity", date:"22/05/2017", _children:[
       {date:"22/05/2017", title:"Restoring sanity 1", views: 12},
       {date:"11/02/2018", title:"Restoring sanity 2", views: 51},
       {date:"04/04/2018", title:"Restoring sanity 3", views: 103},
    ]},
    ]
    
    const topCalcViews = function (values, data, calcParams ) {
    let total = 0;
    values.forEach(function (value) {
        if (value > 0) {
            total += value;
            
        }
    });
    
    return total;
    }

const table = new Tabulator("#table", {
    height:400, 
    data:tabledata, 
    layout:"fitColumns", 
    dataTree: true,
    debugInvalidOptions: true,
    columns:[ 
        {title:"Title", field:"title" },
        {title:"Publish date", field:"date", hozAlign:"left", headerFilter:true},
        {title:"views", field:"views", topCalc: topCalcViews, formatter: function (cell, formatterParams, onRendered) {
            let data = cell.getData();
            let totalViews = 0;

            if (data.isParent) {
                data._children.forEach(child => {
                        totalViews += child.views;
                });
                return totalViews;
            }
            else return cell.getValue();
        }
        }
    ],
});

正如您在小提琴中看到的那样,除了 topCalc 之外,这是可行的。对我来说这是有道理的,因为我正在使用格式化程序并且数据实际上并不存在?我想这就是为什么我也不能使用内置 sum 的原因。

我想要发生的事情:当我过滤时,我希望父级重新计算总视图,以便视图数与落在过滤器范围内的所有行相同。现在,总观看次数保持不变。

我已经尝试了很多方法来让它发挥作用;

  • 我尝试了修改器而不是格式化器,但我也遇到了一些问题。
  • 我尝试将 dataTreeChildColumnCalcs 用于 topCalc,但显然父级的总视图也没有更新。
  • 我尝试为父行调用重新格式化无济于事

顺便说一下,我的目的是只显示数据。目前,我没有编辑计划,我将使用另一个表进行导出。我想我可能可以同时使用 mutators 和 formatters。

我已经被困了很长时间了。非常感谢任何推动有希望的方向!

已回答! 感谢您的出色回答,@Double H!对于那些感兴趣的人,请注意,如果您希望它工作,您不需要覆盖原型。 topCalc 及其格式化就足够了!

【问题讨论】:

    标签: javascript tabulator


    【解决方案1】:

    查看我的实现。我希望你看起来像这样

    Codesandbox

    【讨论】:

    • 谢谢!绝对是我要找的。现在我只需要弄清楚如何扩展原型。我在 Chrome 扩展程序中使用它,而不是模块。还没有这样做。一旦我确定您的代码与看起来一样可靠,我会尽快回复您。再次感谢!
    • 您介意分享您在这里所做的事情吗?我浏览了您的代码,发现我似乎不需要很多代码。你对原型做了什么?如果我删除它,它似乎仍然可以正常工作。另外,你为什么打开dataTreeChildColumnCalcs?这似乎也不需要。时间不早了,所以我可能会错过一两个测试用例。期待您的回答!
    • 是的,你是对的,这里不需要覆盖 Prototype 看看这些小提琴https://jsfiddle.net/ksuqb6pz
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多