Angular 2指令:如何在指令中创建echarts实例?

时间:2017-02-05 12:19:54

标签: angular typescript echarts

目的:我正在尝试为ECharts(图表库)构建一个简单的Angular 2指令

详情

我在ngAfterViewInit()中创建了图表,这是第一次有效,图表会在窗口调整大小时调整大小。

然后我点击另一个页面,ngOnDestroy()运行,图表被销毁。

然后我点击返回图表页面,重新创建图表,但是,当窗口调整大小时,此时间图表不会调整大小,console.log(chart)会返回'undefined'而不是echarts实例。

如何再次获取echarts实例并使其可调整大小?

所有代码

以下是ECharts的EChartsDirective的所有代码:

import { Directive, ElementRef, Input } from '@angular/core';
let echarts = require('echarts');

@Directive({ selector: '[myECharts]' })

export class EChartsDirective {
    el: ElementRef;
    constructor(el: ElementRef) {
        this.el = el;
    }

    @Input() EChartsOptions: any;
    private mychart;


    ngAfterViewInit() {
        let chart = this.mychart = echarts.init(this.el.nativeElement);

        if (!this.EChartsOptions) return;

        this.mychart.setOption(this.EChartsOptions);

        $(window).on('resize', function(){
            console.log(chart);
            chart.resize(); // <- this only works for the first time
                            // if I change to another page, then back to chart page, it will return 'undefined'
                            // the chart is still there, but won't resize on window resize any more
        })
    }

    ngOnDestroy() {
        if (this.mychart) {
            this.mychart.dispose();
        }
    }
}

2 个答案:

答案 0 :(得分:4)

    ngAfterViewInit() {
      this.mychart = echarts.init(this.el.nativeElement);
      if (!this.EChartsOptions) return;

      this.mychart.setOption(this.EChartsOptions);
    }

    @HostListener('window:resize)
    onResize() {
        console.log(chart);
        if(this.mychart) {
          this.mychart.resize();
        }
    }

答案 1 :(得分:0)

使用 ngx-echarts,您可以在 html 中以更 Angular 友好的方式进行:

<div echarts (chartInit)="onChartInit($event)" [options]="options" class="demo-chart"></div>

并在您的组件中:

onChartInit(e: any) {
    this.chartInstance = e;
    console.log('on chart init:', e);
  }

来源:https://xieziyu.github.io/ngx-echarts/#/basic/basic-usage