Angular使用echarts环形图数据展示NaN,点击之后才展示数据

如果确定从后端拿到了数据,并且数据显示的是NaN,点击之后才展示拿到的数据,但是环形图仍旧显示不出来,那么可以确定是页面的渲染问题。

首先我们需要了解Angular的生命周期函数ngOnInit() ngAfterViewInit(),

ngOnOnInit()用来显示数据绑定属性并设置指令或组件的输入属性之后初始化指令或组件,一般写的方法都在其中进行初始化。(之所以出现拿到数据之后展示NaN的原因出现在这一步

ngAfterViewInit()在初始化组件的视图和子视图或包含指令的视图之后响应,在Angular完全初始化组件视图后调用的生命周期钩子。

如何解决:

主要原因就是ngOnInit()时,图形的渲染比数据的加载要快,导致环形图过来了,但是没数据,所以没图(由于 Angular在更改检测期间遍历视图层次结构,因此需要确保子项的更改不会尝试导致其父项的更改。由于单向数据流的工作方式,这种更改将无法正确呈现。angular官网),数据展示形式为NaN,点击一下数据才能正常展示,

解决办法就是在ngOnInit()里面渲染环形图时设置一个计时器或者定时器。setTimeOut()setInterval()

@ViewChild('myCharts', {static: false}) public myCharts: any;
public optionsStorage = {
    title: {
      text: '内存使用情况',
    },
    tooltip: {
      trigger: 'item',
      renderMode: false,
      formatter: '{a} <br/>{b} : {c} ({d}%)'
    },
    legend: {
      orient: 'vertical',
      x: '75%',
      y: '27%',
      formatter: (name) => {
        const data = this.optionsStorage.series[0].data;
        let total:number = 0;
        let tarValue:any = 0;
        for (let i = 0; i < data.length; i++) {
          total += +data[i].value;  //
          if (data[i].name == name) {
            tarValue = data[i].value;
          }
        }
        const p = (tarValue / total * 100).toFixed(1);
        return name + ' ' + ' ' + tarValue + 'M' + ' '  + p + '%';        
      },
      data: ['资源预留量', '内存剩余量', '内存使用情况'],
    },
    series: [{
      name: 'CPU使用情况',
      type: 'pie',
      center: ['35%', '50%'],
      radius: ['50%', '70%'],
      avoidLabelOverlap: false,

      // 显示指针
      label: {
        normal: {
          show: false,
          position: 'center',
          emphasis: {
            show: true
          }
         },
        labelLine :{show:false},
        emphasis: {
          label: {
            show: true,
            fontSize: '35',
            fontWeight: 'bold'
          },
        },

      },
      data: [
        { value: '', name: '资源预留量' },
        { value: '', name: '内存剩余量' },
        { value: '', name: '内存使用情况' },
      ]
    }]
  };

//获取数据,应该专门放在.service服务中
getConfig() {
  configUrl = "url接口"  
  return this.http.get<Config>(this.configUrl,data);
}
//在组件中写的(.component.ts)
showConfig(){
    this.configService.getConfig()
        .subscribe((res)=>{
           let arrStorage = this.optionsStorage.series[0];
           arrStorage.data[0].value = res.key1;
           arrStorage.data[1].value = res.key2;
           arrStorage.data[2].value = res.key3 
        })
}


ngOnInit(): void {
     //初始化数据
    this.loadInfo();
    //初始化渲染环形图
    this.timer = setTimeout(()=>{ this.myCharts=echarts.init(document.getElementById('myStorage')).setOption(this.optionsStorage);
    },300)
  }
  ngAfterViewInit() {
    this.echarts = echarts.init(this.myCharts.nativeElement).setOption(this.optionsStorage);;
  }
//如果想要实时渲染环形图的话,一定要加ngOnDestroy(),并且可以将setTimeOut()换成setInterval()
  ngOnDestroy(): void {
    if(this.timer){
      clearTimeout(this.timer)
    }
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值