2013-12-22 3 views
1

Существует 2 набора массивов, исходный набор данных - data, а новый набор данных - data2. После добавления data к сюжету выполняются панорамирование и масштабирование. Я создал класс Chart для обработки графиков d3.js.Панорамирование/Масштабирование новых добавленных точек на d3.js Диаграмма

Однако после обновления участка с массивом data2 с использованием chart.update(chart.data2), только точки из data кастрюль и масштабирование, точки из data2 остается неподвижным. Есть ли ошибка в коде для chart.update()?

jsfiddle:http://jsfiddle.net/kzQ6K/

chart.update()

/** 
* Update Chart with new Data 
*/ 
this.update = function(newData) { 
    uniqueNewData = _.difference(newData, this.data); 
    this.data = _.union(this.data, uniqueNewData); 

    // Update axes 
    var yMin = d3.min(this.data.map(function(d) {return d.score;})); 
    var yMax = d3.max(this.data.map(function(d) {return d.score;})); 
    var xMin = d3.min(this.data.map(function(d) {return d.timestamp;})); 
    var xMax = d3.max(this.data.map(function(d) {return d.timestamp;})); 
    y.domain([yMin, yMax]); 
    x.domain([xMin, xMax]); 

    // Draw rects 
    var svg = d3.select(this.div + ' svg'); 
    var rects = svg.selectAll('rect.data') 
          .data(this.data, function(d) { return d.timestamp || d3.select(this).attr('timestamp'); }); 
    rects 
     .enter() 
     .append('rect') 
     .classed('data', true); 

    rects 
     .attr('x', function(d) { return x(d.timestamp); }) 
     .attr('y', function(d) { return y(d.score); }) 
     .attr('timestamp', function(d) { return d.timestamp; }) 
     .attr('width', 4) 
     .attr('height', 10) 
     .attr('fill', 'red') 
     .attr('transform', 'translate(' + this.margin.left + ',' + this.margin.top + ')'); 

    svg.select('.x.axis').call(xAxis); 
    svg.select('.y.axis').call(yAxis); 


} 

ответ

1

Проблема заключается в том, что функция zoomed не определен в качестве члена класса, и использует переменные data, x, y, и т.п. из закрытие. Эти переменные не обновляются при вызове функции zoomed.

Хотя этот способ инкапсуляции диаграмм может работать, наиболее стандартный способ сделать это - создать d3-esque functions.

+0

'd3.event' также' null' внутри 'Chart.zoomed', когда он называется. – Nyxynyx

+0

@Nyxynyx Где/как вы используете 'd3.event'? И я предполагаю, что вы переопределили 'zoomed' как функцию класса? Не могли бы вы разместить ссылку на обновленный код? –

+0

В jsfiddle.net/kNWGT/, если вы нажмете кнопку мыши или нажмете на нее кнопку, чтобы добавить новые прямоугольники, затем снова переместите панораму/масштабирование диаграммы, вы увидите, что 3 синих прямоугольника с одинаковой точкой данных поскольку начальные 3 красных прямоугольника не выстраиваются в линию, когда они должны быть идентичными точками данных ... – Nyxynyx

Смежные вопросы