按列重新排序数据表

时间:2014-01-14 12:23:54

标签: crossfilter dc.js

我想知道是否有任何已知方法可以在dc.js中为我的数据表有效添加“重新排序”功能。如果我的用户在完成对图表的选择之后,可以根据哪个列来决定过滤行的排序(例如,通过单击列标题),那将是非常好的。

任何想法从哪里开始?

非常感谢

2 个答案:

答案 0 :(得分:22)

我喜欢使用JQuery数据表:http://datatables.net/

首先添加表格和标题行:

    <table id="dc-data-table" class="list table table-striped table-bordered">
        <thead>
            <tr>
              <th>Country</th>
              <th>Users</th>
            </tr>
        </thead>
    </table>

接下来像平常一样构建你的尺寸:

    var ndx = crossfilter(data),
        countryDimension = ndx.dimension(function (d) {
            return d.country;
        }),

然后绑定jquery数据表:

var datatable = $("#dc-data-table").dataTable({
            "bPaginate": false,
            "bLengthChange": false,
            "bFilter": false,
            "bSort": true,
            "bInfo": false,
            "bAutoWidth": false,
            "bDeferRender": true,
            "aaData": countryDimension.top(Infinity),
            "bDestroy": true,
            "aoColumns": [
                { "mData": "country", "sDefaultContent": ""},
                { "mData": "users", "sDefaultContent": " " }
            ]
        });

最后,如果您希望表格反映其他图表的过滤器,请将其挂钩到dc.js:

        function RefreshTable() {
            dc.events.trigger(function () {
                alldata = countryDimension.top(Infinity);
                datatable.fnClearTable();
                datatable.fnAddData(alldata);
                datatable.fnDraw();
            });
        }

        for (var i = 0; i < dc.chartRegistry.list().length; i++) {
            var chartI = dc.chartRegistry.list()[i];
            chartI.on("filtered", RefreshTable);
        }

这是一个证明这一点的jsFiddle:http://jsfiddle.net/djmartin_umich/d55My/

答案 1 :(得分:4)

这是另一种表格排序方法,它只使用标准的jQuery和dc.js

使用列标题定义表格html。

<table id="data-table">
  <thead>
    <th class="data-table-col" data-col="a">Field A</th>
    <th class="data-table-col" data-col="b">Field B</th>
    <th class="data-table-col" data-col="c">Field C</th>
  </thead>
</table>

设置DC.js dataTable。唯一重要的是列配置。使用不动态创建标题的格式

var dataDim = xf.dimension(function(d) {return d.a;});
var dataTable = dc.dataTable("#data-table")
  .columns([
    function(d) {
      return d.a;
    },
    function(d) {
      return d.b;
    },
    function(d) {
      return d.c;
    }
  ]);

然后,只需将click事件处理程序附加到列标题,然后使用DC.js对表进行排序。编辑 - 您还必须更改维度,以便sortBy对所有数据进行排序,而不仅仅是显示数据

$('#data-table').on('click', '.data-table-col', function() {
  var column = $(this).attr("data-col");
  dataDim.dispose();
  dataDim = xf.dimension(function(d) {return d[column];});
  dataTable.dimension(dataDim)
  dataTable.sortBy(function(d) {
    return d[column];
  });
  dataTable.redraw();
});