По сути, согласно this bl.ocks, я пытаюсь, чтобы все блоки перешли в 0, прежде чем начинать новую последовательность.Я думаю, что мне требуется следующая последовательность:
Update
до 0 Exit
до 0 Update
случайное число Enter
с новым номером
Я попытался следовать приведенному выше шаблону, добавив следующий блок кода:
function update(n1) {
var cellUpdate = cell.selectAll("rect")
.data(d3.range(0));
var n0 = cell.selectAll("rect").size();
var cellExit = cellUpdate.exit().transition()
.delay(function(d, i) { return (n0 - i) * updateDelay; })
.duration(updateDuration)
.attr("width", 0)
.remove();
var cellUpdate = cell.selectAll("rect")
.data(d3.range(n1));
var cellEnter = cellUpdate.enter().append("rect")
.attr("width", 0)
.attr("height", cellSize)
.attr("x", function(i) {
var x0 = Math.floor(i / 100) % 10, x1 = Math.floor(i % 10);
return groupSpacing * x0 + (cellSpacing + cellSize) * (x1 + x0 * 10);
})
.attr("y", function(i) {
var y0 = Math.floor(i / 1000), y1 = Math.floor(i % 100 / 10);
return groupSpacing * y0 + (cellSpacing + cellSize) * (y1 + y0 * 10);
})
.transition()
.delay(function(d, i) { return (i - n0) * updateDelay; })
.duration(updateDuration)
.attr("width", cellSize);
По существу, добавленные мной части являются дополнительнымиcellUpdate
сначала введя данные с 0
, а затем выбрав range(n1)
, что является случайным числом.
Еще одно усилие, которое я попытался сделать, - дважды вызвать функцию с помощью:
(function interval() {
update(Math.floor(0);
update(Math.floor(Math.random() * 100 * 100));
setTimeout(interval, updateDelay * 100 * 100 + updateDuration + 1000);
})();
Оба метода не работают, с блоками, одновременно выходящими и обновляющимися одновременно, или, по крайней мере, похоже на это, моя догадка, что это из-за задержек.Я ищу лучший способ, чтобы иметь возможность выйти на номер по умолчанию и обновить на основе нового номера в рамках того же вызова функции.
Любая помощь очень ценится!