Ionic/Chart.js -无法读取未定义的属性“nativeElement”

k2arahey  于 2023-10-18  发布在  Chart.js
关注(0)|答案(4)|浏览(173)

我有一个简单的项目,它显示了一个离子段,其中有一个Chart.js条形图。我对显示图表本身没有问题,但试图将图表HTML放在Ionic段中会导致以下错误:

ERROR TypeError: Cannot read property 'nativeElement' of undefined
    at HomePage.webpackJsonp.203.HomePage.ionViewDidLoad (home.ts:19)

如果我只是移动<canvas #barcanvas></canvas>并将其放置在.html文档中的几乎任何其他位置,图表显示得很好,但不是在Ionic段元素中。
home.html

<ion-header>
  <ion-navbar>
    <ion-title>
      Ionic Blank
    </ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  <div padding>
    <ion-segment [(ngModel)]="pet">
      <ion-segment-button value="kittens">
        Kittens
      </ion-segment-button>
      <ion-segment-button value="puppies">
        Puppies
      </ion-segment-button>
    </ion-segment>
  </div>

  <div [ngSwitch]="pet">
    <ion-list *ngSwitchCase="'puppies'">
      puppies...
      <canvas #barcanvas></canvas>
    </ion-list>

    <ion-list *ngSwitchCase="'kittens'">
      kittens...
    </ion-list>
  </div>
</ion-content>

home.ts

import { Component, ViewChild } from '@angular/core';
import { NavController } from 'ionic-angular';
import { Chart } from 'chart.js';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {
  @ViewChild('barcanvas') barcanvas;
  barChart: any;

  constructor(public navCtrl: NavController) {

  }

  ionViewDidLoad() {

    this.barChart = new Chart(this.barcanvas.nativeElement, {

      type: 'bar',
      data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
          label: '# of Votes',
          data: [12, 19, 3, 5, 2, 3],
          backgroundColor: [
            'rgba(255, 99, 132, 0.2)',
            'rgba(54, 162, 235, 0.2)',
            'rgba(255, 206, 86, 0.2)',
            'rgba(75, 192, 192, 0.2)',
            'rgba(153, 102, 255, 0.2)',
            'rgba(255, 159, 64, 0.2)'
          ],
          borderColor: [
            'rgba(255,99,132,1)',
            'rgba(54, 162, 235, 1)',
            'rgba(255, 206, 86, 1)',
            'rgba(75, 192, 192, 1)',
            'rgba(153, 102, 255, 1)',
            'rgba(255, 159, 64, 1)'
          ],
          borderWidth: 1
        }]
      }

    });

  }
}
xdyibdwo

xdyibdwo1#

如果你使用的是Angular >=8,现在你必须传递第二个参数给Viewchild作为选项并设置static:真

@ViewChild('barcanvas', {static: true}) barcanvas;
imzjd6km

imzjd6km2#

在home.ts中,你正在加载ionViewDidLoad中的bar,所以如果你想以这种方式放置它,你不能把它放在段中,因为段将无法读取ionViewDidLoad内部数据,因为段也在执行ionViewDidLoad函数后加载,否则如果你想把它放在段中,你应该从ionViewDidLoad()中取出数据并将它们放在其他函数中,因此你可以直接将函数放在段中,因此该函数可以被段读取。

8ulbf1ek

8ulbf1ek3#

**ionViewDidLoad()**不要使用这个。就用这个:ionViewDidEnter().

5lwkijsr

5lwkijsr4#

如果有人遇到这个问题,另一个可能的答案是:在模板中,如果图表画布在条件(if,ng-template,switch等)内,它可能找不到nativeElement。您可以放置一个计时器,以便给予浏览器解决问题的时间。.ts文件中的Ex:

setTimeout(() => {
  this.ionViewDidLoad();
}, 50);

在这个问题上,画布是在一个开关的情况下。

相关问题