Я создал простое приложение Ionic для тестирования интеграции d3.js. Его можно найти здесь: https://github.com/wberger/ionic2-d3js-test а>
Я сделал интеграцию следующим образом:
- Создайте приложение с боковой навигацией и одной страницей (
home.html
) - Добавьте
home.html
в меню. - Загрузите d3.js в index.html:
<script src="https://d3js.org/d3.v4.min.js"></script>
- Добавьте
<div id="chart"></div>
кhome.html
- Создайте диаграмму в
ngAfterViewInit()
вhome.ts
Шаблон home
определяется следующим образом (источник а>):
<ion-header>
<ion-navbar>
<button menuToggle>
<ion-icon name="menu"></ion-icon>
</button>
<ion-title>
Ionic Blank
</ion-title>
</ion-navbar>
</ion-header>
<ion-content padding>
The world is your oyster.
<p>
If you get lost, the <a href="http://ionicframework.com/docs/v2">docs</a> will be your guide.
</p>
<div id="chart"></div>
<p>After</p>
</ion-content>
Создание диаграммы реализовано следующим образом (источник а>):
ngAfterViewInit() {
this.createChart();
}
createChart() {
var chart = d3.select("#chart").append("svg")
.attr("width", 100)
.attr("height", 100)
.append("g");
var rows = [
{x: 1, y: 1},
{x: 2, y: 2},
{x: 3, y: 3},
];
var xScale = d3.scaleLinear()
.range([0, 100])
.domain([1, 3]);
var yScale = d3.scaleLinear()
.range([100, 0])
.domain([1, 3]);
chart.selectAll(".dot")
.data(rows)
.enter().append("circle")
.attr("class", "dot")
.attr("cx", (row) => { return xScale(row.x) })
.attr("cy", (row) => { return yScale(row.y) })
.attr("r", 3.5);
}
При запуске приложения диаграмма отображается так, как задумано. Но при (повторном) открытии страницы из бокового меню графика нет. При проверке TS/DOM в Google Chrome я могу наблюдать следующее поведение при повторном открытии:
ngAfterViewInit()
вызывается и, в свою очередь, вызывает 'createChart()'- Ранее созданные элементы SVG все еще там
- Второй элемент SVG создается и заполняется
createChart()
После ngAfterViewInit()
созданный SVG исчезнет. Кажется, что DOM заменен пустым (или кэшированным??) шаблоном.
Итак, мои вопросы:
- Что здесь не так? Что я должен знать?
- Как я могу это исправить?