2014-12-28 4 views
1

Здесь я выбрал 3 фильтра 1 из каждого графика и вставил этот закодированный url в url param. но когда я нажимаю кнопку расшифровки url, она перерисовывает только средние фильтры диаграммы, но не оставшиеся один раз. Что мне делать? благодаряСохранение фильтров dc.js в URI и их восстановление

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

+0

Я не эксперт в dc.js, но вы можете получить больше людей, желающих ответить, если вы запустили свой код через http://jsbeautifier.org/ и предоставили только код относящихся к вашей проблеме. Если возникнет ошибка, возможно, будет полезно использовать stacktrace. Для меня это кажется смутной проблемой, и было бы намного лучше, если бы вы могли, по крайней мере, сузить, какова ваша проблема. –

+0

Я согласен с @PatrickRoberts. Лучший/более вежливый способ задать такой вопрос - поставить свой код в jsFiddle, чтобы люди могли попробовать его. Затем опубликуйте только соответствующие части в своем вопросе SO. Если вы отредактируете, вернитесь к нулю. :-) Это интересная проблема кстати. Мы хотели бы иметь канонический способ хранения фильтров в URL-адресе. – Gordon

+0

thank u @ Gordon.i vl try – sandeep

ответ

1

Похоже, что ваш код является правильным для общего случая , но из-за некоторых причуд в том, что 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

+0

спасибо .. @ Gordon.it действительно помог мне – sandeep

+0

Рад помочь. Пожалуйста, примите ответ ... только чтобы я мог лучше следить за тегом, конечно. ;-) – Gordon

+0

да, это сработало для меня ... @ Гордон. еще раз, спасибо – sandeep

1
+0

Мне нравится этот подход лучше, потому что он явно выбирает фильтры и применяет их по имени, а не по индексу, хотя код в вопросе хорош для быстрого и грязного решения. Спасибо за совместное использование, я обязательно буду использовать это, когда буду документировать, как это сделать. На данный момент этот вопрос может служить неофициальными документами. – Gordon