2013-06-25 3 views
3

Предположим, я использую слегка модифицированную версию example code from the selection.data() API docs,Получить ранее ограниченные данные

var matrix = [ 
    [11975, 5871, 8916, 2868], 
    [ 1951, 10048, 2060, 6171], 
    [ 8010, 16145, 8090, 8045], 
    [ 1013, 990, 940, 6907] 
]; 

var tr = d3.select("body").append("table").selectAll("tr") 
    .data(matrix, function(d) { return d[0]; }) 
    .enter().append("tr"); 

var td = tr.selectAll("td") 
    .data(function(d) { return d; }) 
.enter().append("td") 
    .text(function(d) { return d; }); 

На последующем обновлении моей матрицы 2d массива, я хочу, чтобы поймать (и делать что-то с ...) любая ячейка таблицы, которая изменяется. Например.

// updated matrix 
var matrix2 = [ 
    [11975, 5871, 8916, 2868], 
    [ 1951, 10048, 2060, 6171], 
    [ 8010, 16145, 8090, 999999999], 
    [ 1013, 990, 940, 6907] 
]; 

// bind the new data 
var tr = d3.select("table").selectAll("tr") 
    .data(matrix2, function(d) { return d[0]; }); 

var cells = tr.selectAll("td") 
    .data(function(d) { return d; }); 

var updatedCells = rows.filter(function(d,i) { 
    // HOWTO get previously bound value for cell??? 
    var prevCellValue = null; 
    return prevCellValue != d; 
}); 

В результате выбора обновления, полученного в результате соединения, существует ли способ получить ранее привязанное значение для данного выбора? Как только я позвонил selection.data(newData), кажется, что я потерял ранее привязанные данные. Я могу позвонить selection.data() и временно сохранить вывод переменной перед привязкой новых данных к элементу DOM, но кажется неудобным (особенно для этого примера 2D-массива) индексировать ранее привязанные данные в анонимной функции, переданные, например, selection.filter().

(Кстати, я помеченный «SVG», потому что мой фактический пример использует SVG элементы, так что я уже пытался this.textContent в моем selection.filter() функции. К сожалению, this.textContent уже вновь связанное значение данных для данной ячейки.)

EDIT: this.textContent «сорт» имеет ранее привязанные данные, но он потенциально обрабатывается. Я бы предпочел, если возможно, необработанные, неизменные данные.

ответ

1

D3 не предоставляет способ возврата ранее привязанных данных. В вашем случае, вы можете рассмотреть возможность сохранения значения данных в качестве атрибута элемента он связан с так что вы можете сравнить его позже, то есть что-то вроде

.data(...) 
.attr("myvalue", function(d) { return d; }); 

Тогда вы должны быть в состоянии сделать что-то вроде

cells.filter(function(d) { return d3.select(this).attr("myvalue") != d; }); 
+1

Я могу предложить использовать [настраиваемые атрибуты данных] (http://html5doctor.com/html5-custom-data-attributes) для их хранения. –