在URI中存储dc.js过滤器并恢复它们

时间:2014-12-28 09:51:37

标签: javascript d3.js dc.js

这里我从每个图表中选择了3个过滤器1并将该编码的URL粘贴到url param中。但是当我按下解码网址按钮时,它只重绘中间图表过滤器而不是剩下的一次..我该怎么办? 感谢

function encodeFunction()
{
    var filters = [];

    for (var i = 0; i < dc.chartRegistry.list().length; i++)
    {

        var chart = dc.chartRegistry.list()[i];

        for (var j = 0; j < chart.filters().length; j++)
        {
            filters.push({ChartID: chart.chartID(), Filter: chart.filters()[j]});
        }
    }
    var urlParam =  encodeURIComponent(JSON.stringify(filters));
    alert(urlParam);
}
function decodeFunction()
{
    //encoded url here
    var urlParam="%5B%7B%22ChartID%22%3A1%2C%22Filter%22%3A2012%7D%2C%7B%22ChartID%22%3A2%2C%22Filter%22%3A%5B1.0454545454545454%2C4.045454545454545%5D%7D%2C%7B%22ChartID%22%3A3%2C%22Filter%22%3A%22Mr%20B%22%7D%5D ";

    var filterObjects = JSON.parse(decodeURIComponent(urlParam));

    for (var i = 0; i< filterObjects.length; i++)
    {
        dc.chartRegistry.list()[filterObjects[i].ChartID-1].filter(filterObjects[i].Filter);
    }

    // dc.renderAll();

    dc.redrawAll();
}

这里是小提琴:js fiddle link

2 个答案:

答案 0 :(得分:2)

看起来您的代码在一般情况下是正确的,但由于dc.js处理过滤器的方式存在一些怪癖,您无法从序列化表单中恢复范围过滤器。

我能够通过为数组添加一个特殊情况来实现它:

   for (var i = 0; i< filterObjects.length; i++)
   {
       var filter = filterObjects[i].Filter;
       if(filter instanceof Array) filter = dc.filters.RangedFilter(filter[0], filter[1]);
       dc.chartRegistry.list()[filterObjects[i].ChartID-1].filter(filter);
   }

这是我的小提琴:http://jsfiddle.net/gordonwoodhull/4dv93aht/10/

我不认为应该需要这样的特殊情况,所以我在这里提出了一个问题:https://github.com/dc-js/dc.js/issues/819

答案 1 :(得分:1)