Угловой 2 и AmCharts

Кто-нибудь знает, как внедрить Amcharts в Angular2 (БЕТА)?

Я пытался следовать пути/шаблону этого вопроса, однако я был довольно успешно с charts.js, но, к сожалению, я не могу использовать charts.js для своей программы построения графиков. Поскольку кажется, что все в Angular2 Beta — это неизведанная территория, я понятия не имею, с чего начать? Я воспроизвел приведенный выше пример с charts.js, но безуспешно и без ошибок.

/// <reference path="../DefinitelyTyped/amcharts/AmCharts.d.ts" />

Существует библиотека DefinitelyTyped для amcharts (пока не для plot.ly).

ОБНОВЛЕНИЕ: Вот директива:

/// <reference path="../DefinitelyTyped/amcharts/AmCharts.d.ts" />



import {Directive, ElementRef, Renderer, Input} from 'angular2/core';

@Directive({
selector: '[chart]',
})

export class amChartDirective  {
          var chartData = [{date: new Date(2015,2,31,0, 0,      0,      0),value:372.10,volume:2506100},{date: new Date(2015,3,1,0, 0, 0, 0),value:370.26,volume:2458100},{date: new Date(2015,3,2,0, 0, 0, 0),value:372.25,volume:1875300},{date: new Date(2015,3,6,0, 0, 0, 0),value:377.04,volume:3050700}];
          var chart;
          AmCharts.ready(function () {
              createStockChart();
          });
          function createStockChart() {
              chart = new AmCharts.AmStockChart();
              chart.dataDateFormat = "M-D-YY";
              chart.pathToImages = "http://www.strategic-options.com/trade/3_party/amcharts/images/";
              var dataSet = new AmCharts.DataSet();
              dataSet.dataProvider = chartData;
              dataSet.fieldMappings = [{
                      fromField: "value",
                      toField: "value"
                  }, {
                      fromField: "volume",
                      toField: "volume"
                  }];
              dataSet.categoryField = "date";
              chart.dataSets = [dataSet];
              // PANELS ///////////////////////////////////////////
              // first stock panel
              var stockPanel1 = new AmCharts.StockPanel();
              stockPanel1.showCategoryAxis = false;
              stockPanel1.title = "Value";
              stockPanel1.percentHeight = 70;
              // graph of first stock panel
              var graph1 = new AmCharts.StockGraph();
              graph1.valueField = "value";
              stockPanel1.addStockGraph(graph1);
              // create stock legend
              var stockLegend1 = new AmCharts.StockLegend();
              stockLegend1.valueTextRegular = " ";
              stockLegend1.markerType = "none";
              stockPanel1.stockLegend = stockLegend1;
              // second stock panel
              var stockPanel2 = new AmCharts.StockPanel();
              stockPanel2.title = "Volume";
              stockPanel2.percentHeight = 30;
              var graph2 = new AmCharts.StockGraph();
              graph2.valueField = "volume";
              graph2.type = "column";
              graph2.fillAlphas = 1;
              stockPanel2.addStockGraph(graph2);
              // create stock legend
              var stockLegend2 = new AmCharts.StockLegend();
              stockLegend2.valueTextRegular = " ";
              stockLegend2.markerType = "none";
              stockPanel2.stockLegend = stockLegend2;
              // set panels to the chart
              chart.panels = [stockPanel1, stockPanel2];

              // PERIOD SELECTOR ///////////////////////////////////
              var periodSelector = new AmCharts.PeriodSelector();
              periodSelector.periods = [{

                      period: "DD",
                      count: 10,
                      label: "10 days"
                  }, {
                      period: "MM",
                      count: 1,
                      label: "1 month"
                  }, {
                      period: "YYYY",
                      count: 1,
                      label: "1 year"
                  }, {

                      period: "YTD",
                      label: "YTD"
                  }, {
                      selected: true,
                      period: "MAX",
                      label: "MAX"
                  }];
              periodSelector.selectFromStart = true;
              chart.periodSelector = periodSelector;


              var panelsSettings = new AmCharts.PanelsSettings();
              panelsSettings.usePrefixes = true;
              chart.panelsSettings = panelsSettings;

              //Cursor Settings
              var cursorSettings = new AmCharts.ChartCursorSettings();
              cursorSettings.valueBalloonsEnabled = true;
              cursorSettings.graphBulletSize = 1;
              chart.chartCursorSettings = cursorSettings;

              // EVENTS

              var e0 = {date: new Date(2016,0,7), type: "arrowDown", backgroundColor: "#FF0707", graph: graph1, text: "Sell Short", description: "Sell Short equity here"};
              dataSet.stockEvents = [e0];
              chart.write("chartdiv");
          }
          function hideStockEvents() {
              window.console.log('woop');
              chart.hideStockEvents();
          }
          function showStockEvents() {
              window.console.log('woop');
              chart.showStockEvents();
          }
}
}

Тогда вот template.html из app.component.ts

<chart>helllo from AmCharts part 2<divid="chartdiv"  style="width:100%; height:600px;"></div></chart>

Приведенный выше код javascript/amcharts работает на моем php-сайте. Вт

Когда я запускаю код, я не получаю никаких ошибок.

Я подозреваю, что это одно из двух?

Что-то не так с моим селектором или html отображается, но JavaScript не «пишет диаграмму».

chart.write("chartdiv");

Наконец, он не выдает никаких ошибок в консоли, что действительно странно, потому что эта бета-версия Angular2 постоянно выдает ошибки.


person Chad    schedule 13.01.2016    source источник
comment
не хочешь объяснить, почему ты потерпел неудачу? в каком вопросе вам нужна помощь?   -  person Langley    schedule 13.01.2016
comment
Компоненты диаграммы PrimeNG могут помочь в качестве справки. primefaces.org/primeng/#/piechart   -  person Cagatay Civici    schedule 10.02.2016


Ответы (4)


<сильный>1. Установка

npm install amcharts/amcharts3-angular2 --save

<сильный>2. В файле HTML загрузите библиотеку amCharts, используя теги:

<script src="https://www.amcharts.com/lib/3/amcharts.js"></script>
<script src="https://www.amcharts.com/lib/3/serial.js"></script>
<script src="https://www.amcharts.com/lib/3/themes/light.js"></script>

<сильный>3. В своем модуле приложения импортируйте модуль AmChartsModule и добавьте его к импорту:

import { AmChartsModule } from "amcharts3-angular2";

@NgModule({
  imports: [
    AmChartsModule
  ]
})
export class AppModule {}

<сильный>4. Внедрите AmChartsService в компонент вашего приложения, создайте элемент с идентификатором, а затем используйте метод makeChart для создания диаграммы:

import { AmChartsService } from "amcharts3-angular2";

@Component({
  template: `<div id="chartdiv" [style.width.%]="100" [style.height.px]="500"></div>`
})
export class AppComponent {
  private chart: any;

  constructor(private AmCharts: AmChartsService) {}

  ngOnInit() {
    this.chart = this.AmCharts.makeChart("chartdiv", {
      "type": "serial",
      "theme": "light",
      "dataProvider": []
      ...
    });
  }

  ngOnDestroy() {
    this.AmCharts.destroyChart(this.chart);
  }
}

Первый аргумент makeChart должен совпадать с идентификатором . Идентификатор может быть любым, но если вы отображаете несколько диаграмм, каждая диаграмма должна иметь свой идентификатор.

Когда вы закончите работу с диаграммой, вы должны вызвать метод destroyChart. Хорошо поместить это в метод ngOnDestroy.

<сильный>5. Если вы хотите изменить диаграмму после того, как диаграмма была создана, вы должны внести изменения с помощью метода updateChart:

// This must be called when making any changes to the chart
this.AmCharts.updateChart(this.chart, () => {
  // Change whatever properties you want, add event listeners, etc.
  this.chart.dataProvider = [];

  this.chart.addListener("init", () => {
    // Do stuff after the chart is initialized
  });
});

Пример проекта: https://github.com/amcharts/amcharts3-angular2

person Chandrahasan    schedule 18.04.2017
comment
пожалуйста, предоставьте рабочий пример для amcharts3-angular2, поскольку вы не знаете, как передавать данные в поставщик данных! - person heart hacker; 28.06.2017

Благодаря помощи службы поддержки AmCharts.

Рабочий плункер можно найти здесь.

Ключевой проблемой была эта строка кода: вместо этого:

AmCharts.ready(function () {
    createStockChart();
});

Вместо этого сделайте следующее:

if (AmCharts.isReady) {
    createStockChart();

} else {
    AmCharts.ready(function () {
        createStockChart();
    });
}

ОБНОВИТЬ:

Вот расширенный ответ с использованием службы Angular для получения данных для диаграммы. HTTP-провайдеры Angular2, получите строку из JSON для Amcharts< /а>

person Chad    schedule 01.02.2016
comment
Я получаю сообщение об ошибке компилятора машинописного текста, в котором говорится, что не удается найти диаграммы с именами. Это когда я пишу: AmCharts.ready(function () { createStockChart(); }); - person AngularM; 15.02.2016
comment
Только 3 вещи, о которых я могу думать: Вы используете операторы if, чтобы увидеть, готов ли Amcharts? Во-вторых, загружена ли у вас библиотека DefinitelyTyped? Наконец-то все скрипты amCharts загружены на страницу index.html? - person Chad; 15.02.2016
comment
Я загружаю сценарии am в индекс, где они должны быть? - person AngularM; 15.02.2016
comment
Кажется, он не уверен, что такое диаграммы am - person AngularM; 15.02.2016
comment
Все работает нормально, но компилятор машинописного текста жалуется, что не может найти диаграммы с именами? Его нужно импортировать? - person AngularM; 16.02.2016
comment
У меня такая же проблема с компилятором, я просто проигнорил. (пожалуйста, проверьте ответ, если это решило вашу проблему, спасибо.) - person Chad; 18.02.2016
comment
Мне кажется, что chartdiv еще не существует, когда вызывается функция chart.write. Поэтому я запускаю логику в ngAfterViewInit. - person Aetherix; 28.05.2016

Я бы сказал, что ваш селектор неверен, вы используете тег элемента <chart></chart>, но в объявлении директивы вы используете [chart], который выбирает атрибут. Это оставит вам 2 возможных варианта:

Вариант 1

@Directive({
   selector: 'chart', //remove the straight brackets to select a tag
   ...
})

Вариант 2

<div chart>...</div> <!-- now you can use the attribute selector -->
person Poul Kruijt    schedule 13.01.2016
comment
Спасибо, я не думаю, что это проблема, потому что это тот же способ, которым «[chart]» загружает chart.js, и он работал у меня до того, как я запустил AmCharts. Кроме того, теги div amcharts работают с html, но диаграммы в теге div не заполняются. Так что я начинаю думать, что это график загрузки/записи. Директива попадает на страницу до того, как html появится в браузере. - person Chad; 13.01.2016

Я сделал две вещи. (проблема еще не решена).

  1. Это был последний код, который я использовал в template.html.

    <div id="chartdiv" chart2 style="width:100%; height:600px;"></div>

  2. Селектор остался прежним. selector: '[chart2]'

  3. Я также запустил npm start для компиляции TypeScript. Что, я думаю, могло бы помочь.

Надеюсь, это поможет кому-то.

person Chad    schedule 13.01.2016
comment
Я не могу заставить это работать: я следил за плункером и получаю эту ошибку: не могу найти имя «AmCharts». Я также добавил библиотеки - person AngularM; 15.02.2016
comment
Убедитесь, что вы следуете ответу, который я отправил 01.02.16, и у которого есть зеленая галочка. Тот работает. (Я только что проверил.) Мне нужно удалить этот ответ. - person Chad; 15.02.2016