Я боролся с проблемами, связанными с переходами в D3. Рассмотрим этот код:
svg.selectAll("path")
.data(data, key)
.enter().append("path")
.attr("d", someFunctionThatReturnsAPath);
});
И через несколько секунд я вызываю следующее в setTimeout
:
svg.selectAll("path")
.transition()
.duration(2000)
.attr("d", someFunctionThatReturnsADifferentPath);
});
Второй вызов правильно обновляет пути, но не анимирует переход. Почему нет перехода, когда атрибут d
обновляется во втором вызове?
Обратите внимание, что пути очень сложные. В обоих вызовах есть заметная задержка перед тем, как пути будут фактически отрисованы. Может быть, это связано с отсутствием перехода?
Я новичок в D3, но я читал о переходах и не могу понять, почему это ведет себя не так, как я ожидаю.
Обновить
Согласно ответу @Marjancek, я предоставляю более подробную информацию о двух вызываемых функциях.
Вот определение someFunctionThatReturnsAPath
:
function(d) {
var coordinates = [];
for (var i = d.track.length - 1; i >= 0; i--) {
// We only care about the last 10 elements
if (coordinates.length >= 10)
break;
coordinates.push(d.track[i]);
}
return path({type: "LineString", coordinates: coordinates});
};
И someFunctionThatReturnsADifferentPath
:
function(d) {
var coordinates = [];
for (var i = d.track.length - 1; i >= 0; i--) {
// We only care about the last 20 elements
if (coordinates.length >= 20)
break;
coordinates.push(d.track[i]);
}
return path({type: "LineString", coordinates: coordinates});
};
где путь определяется следующим образом (projection
равно d3.geo.albersUsa()
):
var path = d3.geo.path()
.projection(projection);
Цель состоит в том, чтобы при втором вызове линия была расширена на 10 новых точек данных.