Как вызвать функцию стрелки машинописи и функцию JavaScript в одном событии - PullRequest
0 голосов
/ 19 июня 2019

Я хочу вызвать функцию javascript и функцию машинописи из одного и того же события. Это событие onClick на графике. Я относительно плохо знаком с машинописным и угловатым языком, поэтому я не знаю, возможно ли то, что я делаю.

Проблема в том, что мне нужно вызвать функцию javascript для получения активированного бара на графике и функцию машинописи, чтобы открыть диалоговое окно в угловом компоненте.

    onClick: function(evt){

      console.log(this);//<-- returns chart

      bar: () => {console.log(this)}; //<-- here I try to get this as component
      bar(); // <--doesnt work

      //console.log(document.getElementById('myChart'));
  }

Может быть, лучше, если я покажу все это.

  public barChartOptions = {
    scaleShowVerticalLines: false,
    responsive: true,
    events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],
    onHover: console.log('onHover'),

    onClick: function(evt){
      //console.log(evt); Mouse Event
      console.log(this);
      const getFirst = array => console.log(this);
      console.log(getFirst);
      //bar: () => {console.log(this)};
      //bar();
      //console.log(document.getElementById('myChart'));
  },
    /*
    onClick : (evt, datasets) => {
      //let self = this;
      //console.log(self);
      if(datasets.length > 0){
        this.openDialog();
        console.log(this);
        console.log(this.barChart);
      }
    },*/
    scales: {
      xAxes: [{
        stacked: true
      }],
      yAxes: [{
        stacked: true
      }]
    },
    legend: {
      display: true,
      position: 'right'
    },
    tooltips: {
      enabled: true,
      mode: 'point'
    }
  };

это мой HTML шаблон:


  my-bar-dialog works!
  <div>
    <div style="display: block">
      <canvas baseChart
              id="myChart"
              [datasets]="barChartData"
              [labels]="barChartLabels"
              [options]="barChartOptions"
              [legend]="barChartLegend"
              [chartType]="barChartType">
      </canvas>
    </div>
  </div>

  <button mat-raised-button (click)="openDialog()">Pick one</button>
  <button (click)="openDialog()">Pick one</button>

Теперь, у меня есть два разных "это": 1)

    onClick: function(evt){
      let that = this;
      let bar=()=> {console.log(that.this)};
      bar();

  },

2)

    onClick : (evt, datasets) => {
      if(datasets.length > 0){
        console.log(this);
      }
    },

1 возвращает символ, 2 возвращает компонент. Но мне нужно, чтобы они оба были в одном и том же событии / функции, так как мне нужно вызывать api-функции chartjs, и мне нужно вызывать функцию из моего компонента.

А вот и мой компонент

import { Component, OnInit, Inject } from '@angular/core';
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
import { BarChartService } from '../bar-chart.service';
import { barChartClass } from '../barChartClass';

declare var foo: Function;

@Component({
  selector: 'app-my-bar-dialog',
  templateUrl: './my-bar-dialog.component.html',
  styleUrls: ['./my-bar-dialog.component.css'],
})
export class MyBarDialogComponent implements OnInit {

  client: string;
  tenant: string;

  constructor(public dialog: MatDialog, private barChartService: BarChartService) {
    foo();
  }
  //First BarChart
  barChart: barChartClass;
  public barChartLabels: any;
  public barChartType: any;
  public barChartLegend: any;
  public barChartData: any;

  getBarChart(): void {
    this.barChartService.getMockBarChart().subscribe(
      barChart => this.barChart = barChart
    );
    this.barChartData = this.barChart.barChartData;
    this.barChartLabels = this.barChart.barChartLabels;
    this.barChartType = this.barChart.barChartType;
    this.barChartLegend = this.barChart.barChartLegend;
  }

  public barChartOptions = {
    scaleShowVerticalLines: false,
    responsive: true,
    events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],
    onHover: console.log('onHover'),


    onClick: function(evt){
      //console.log(evt); Mouse Event
      //console.log(this);
      let that = this;
      //bar: () => {console.log(this)};
      let bar=()=> {console.log(that.this)};
      bar();
      //bar();
      //console.log(document.getElementById('myChart'));
  },
    /*
    onClick : (evt, datasets) => {
      //let self = this;
      //console.log(self);
      if(datasets.length > 0){
        this.openDialog();
        console.log(this);
        console.log(this.barChart);
      }
    },*/
    scales: {
      xAxes: [{
        stacked: true
      }],
      yAxes: [{
        stacked: true
      }]
    },
    legend: {
      display: true,
      position: 'right'
    },
    tooltips: {
      enabled: true,
      mode: 'point'
    }
  };

  openDialog(): void {
    const dialogRef = this.dialog.open(DialogData, {
      width: '250px',
      data: {client: this.client, tenant: this.tenant}
    });

    dialogRef.afterClosed().subscribe(result => {
      console.log('The dialog was closed');
      this.client = result;
    });
  }
  ngOnInit() {
    this.getBarChart();
  }
}

@Component({
  selector: 'dialog-data',
  templateUrl: 'dialog-data.html',
  styleUrls: ['dialog-data.css']
})
export class DialogData {

  constructor(
    public dialogRef: MatDialogRef<DialogData>,
    @Inject(MAT_DIALOG_DATA) public data: DialogData) {}

  onNoClick(): void {
    this.dialogRef.close();
  }

}

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

Что вы делаете со строкой и двоеточием в функции, так это то, что вы пытаетесь описать ее тип, а не объявить ее.Поэтому, если вы действительно хотите объявить функцию, сделайте это:

onClick: function(evt) {

    console.log(this);//<-- returns chart

    let bar = () => { console.log(this) };
    bar();

    //console.log(document.getElementById('myChart'));
  }

, если вы хотите описать и объявить ее, сделайте это:

  onClick: function(evt) {

    console.log(this);//<-- returns chart

    let bar: () => void = () => { console.log(this) }; //<-- here I try to get this as component
    bar(); // <--doesnt work

    //console.log(document.getElementById('myChart'));
  }
0 голосов
/ 19 июня 2019

перед использованием диаграммы в компоненте присвойте ее какой-нибудь другой переменной, такой как

var that=this

, затем на вашем графике

 onClick: function(evt){

      console.log(this);//<-- returns chart

   let   bar= () => {console.log(that)}; //<-- that should have your component refrence

  }

Stackblitz demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...