2015-03-08 1 views
1

Можно ли сразу добавить набор фильтров на диаграмме постоянного тока? Например, скажем, у меня есть pieChart и массив значений фильтра для применения.dc.js добавить сразу несколько фильтров

var osChart = dc.pieChart('#oschart'); 

И входной набор фильтров, скажем

var filters = ["linux", "mac osx", "windows", "solaris"] 

Как я могу применить фильтры, так что генерируется только один «фильтруется» событие? я могу сделать что-то вроде

for (var i=0; i < filters.length; i++) { 
    osChart.filter(filters[i]); 
} 

Однако, что будет генерировать 4 filtered событие. Я применяю фильтры, основанные на том, что пользователь вводил в текстовое поле. Когда применяется фильтр, я делаю несколько вызовов ajax, и это имеет тенденцию замедляться, если я применяю фильтры один за другим. Я могу избежать дополнительных вызовов ajax, если фильтры можно установить сразу.

crossfilter имеет функцию filterFunction, которая может выполнить эту задачу, но я не уверен, как я могу применить ее на диаграмме постоянного тока. Применить filterFunction на osChart.dimension() не получилось. С последней версией dc я видел некоторые функции, такие как addFilterHandler и removeFilterHandler, однако я не могу протестировать и развернуть эту версию прямо сейчас.

Какие еще варианты у меня есть?

ответ

1

Глядя на код, который несколько запутанным, вы можете передать массив внутри другого массива к .filter() (или без документов, но unmagical .replaceFilter()) без потери производительности, потому что оно будет применять все фильтры перед вызовом событие filtered.

Из последних .filter() источника, который использует обработчик, но имеет такое же поведение:

if (_ instanceof Array && _[0] instanceof Array && !_.isFiltered) { 
     _[0].forEach(function (d) { 
      if (_chart.hasFilter(d)) { 
       _removeFilterHandler(_filters, d); 
      } else { 
       _addFilterHandler(_filters, d); 
      } 
     }); 
    } else if (_ === null) { 
     _filters = _resetFilterHandler(_filters); 
    } else { 
     if (_chart.hasFilter(_)) { 
      _removeFilterHandler(_filters, _); 
     } else { 
      _addFilterHandler(_filters, _); 
     } 
    } 
    applyFilters(); 
    _chart._invokeFilteredListener(_); 

Так что, если он находит массив, который не имеет в isFiltered метода, а первый элемент этого массива также является массив, он будет перебирать элементы во вложенном массиве.

Например, передайте [["linux", "mac osx", "windows", "solaris"]] для фильтрации этих четырех значений. (Спасибо @marcin за разъяснение!)

+0

ах, поэтому он должен быть массивом в массиве, например. .replaceFilter ([["linux", "mac osx", "windows", "solaris"]]) – marcin

+0

Действительно @marcin? Это удивительно. На какой схеме вы работаете? – Gordon

+0

pieChart. Первая строка кода в этом ответе ('if (_ instanceof Array && _ [0] instanceof Array &&') проверяет, является ли первый элемент массива массивом. – marcin