如何从 Google 图表回调访问 Angular 组件 属性
How to access Angular component property from a Google Charts callback
使用 angular-google-charts
(Angular 13.2),我需要创建一个带有自定义工具提示的 TreeMap。 GoogleChartComponent 有一个名为 generateTooltip 的选项 属性,它接受一个回调函数。从该函数,我需要访问包含 GoogleChartComponent 的 Angular 组件 (chart.data) 的 属性 数据。但是我无法从回调函数中访问组件的 属性 。 Google 网站上的示例是可以理解的直接 JavaScript。
<!-- dashboard.component.html -->
<google-chart
[data]="chart.data"
[options]="chart.options"
[title]="chart.title"
[type]="chart.type"
[columns]="chart.columns"
[height]="chart.height"
style="width: 100%"
></google-chart>
// dashboard.component.ts
import { Component, OnInit } from '@angular/core'
import { ChartType} from 'angular-google-charts'
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.scss']
})
export class DashboardComponent implements OnInit {
public chart = {
title: '',
type: ChartType.TreeMap,
data: [
['Global', null, 0, 0, 'Global'],
['Americas', 'Global', 0, 0, 'Global'],
['EMEA', 'Global', 0, 0, 'Global'],
['Acme - Lab 1YR (New)', 'Americas', 326000, 100, 'Susan Moore'],
['Flexa - DevOps 1YR (New)', 'Americas', 206000, 0, 'Jeremy Young'],
['Organo - CI/CD 1YR (New)', 'EMEA', 188000, 0, 'Sif Nilsen'],
['Ny Carlsberg Glyptotek - Automated Test Lab 300 devices 1YR (New)', 'EMEA', 212000, 0, 'Nils Peter Bjørnsen'],
['Dunder Mifflin - SCM 2YR (New)', 'Americas', 448000, 50, 'Justin Case']
],
columns: [
{type: 'string', label: 'Opportunity', role: 'domain'},
{type: 'string', label: 'Parent', role: 'data'},
{type: 'number', label: 'Amount', role: 'tooltip'},
{type: 'number', label: 'Score', role: 'data'},
{type: 'string', label: 'Owner', role: 'tooltip'}
],
options: {
minColor: '#f00',
midColor: '#ddd',
maxColor: '#0d0',
headerHeight: 0,
fontFamily: 'Nunito',
fontSize: 13,
fontColor: 'black',
generateTooltip: this._showFullTooltip
},
height: 290,
}
constructor () {
}
_showFullTooltip(row: number, size: number, value: number) {
// This is where I need to get values out of this.chart.data[row]
const amount = size.toLocaleString('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 });
const tooltip = `<div style="color:#fff; background:#313A4B; padding: 10px; border-width:1px; border-style: solid; border-color:#fff;">${amount}</div>`
return tooltip;
}
}
在上面的示例中,传递给回调的参数之一是 row。我需要得到 this.chart.data[row]
。这是行不通的。我认为这是因为回调函数在 Angular 之外工作,但我不确定将 _showFullTooltip() 函数连接到组件属性的最佳方法是什么。
有什么建议吗?
这不是 Angular 问题,而是 JS 作用域问题。不要分配 generateTooltip: this._showFullTooltip
,而是像 generateTooltip: this._showFullTooltip.bind(this)
.
那样将作用域绑定到函数
当您传递函数引用时,this
关键字将成为 whoever/whatever 调用该函数的上下文。通过使用 .bind(this)
,您可以使用当前受让人上下文 (DashboardComponent) 覆盖函数调用上下文。这应该允许您在 _showFullTooltip
函数中使用 this.chart.data[row]
。
使用 angular-google-charts
(Angular 13.2),我需要创建一个带有自定义工具提示的 TreeMap。 GoogleChartComponent 有一个名为 generateTooltip 的选项 属性,它接受一个回调函数。从该函数,我需要访问包含 GoogleChartComponent 的 Angular 组件 (chart.data) 的 属性 数据。但是我无法从回调函数中访问组件的 属性 。 Google 网站上的示例是可以理解的直接 JavaScript。
<!-- dashboard.component.html -->
<google-chart
[data]="chart.data"
[options]="chart.options"
[title]="chart.title"
[type]="chart.type"
[columns]="chart.columns"
[height]="chart.height"
style="width: 100%"
></google-chart>
// dashboard.component.ts
import { Component, OnInit } from '@angular/core'
import { ChartType} from 'angular-google-charts'
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.scss']
})
export class DashboardComponent implements OnInit {
public chart = {
title: '',
type: ChartType.TreeMap,
data: [
['Global', null, 0, 0, 'Global'],
['Americas', 'Global', 0, 0, 'Global'],
['EMEA', 'Global', 0, 0, 'Global'],
['Acme - Lab 1YR (New)', 'Americas', 326000, 100, 'Susan Moore'],
['Flexa - DevOps 1YR (New)', 'Americas', 206000, 0, 'Jeremy Young'],
['Organo - CI/CD 1YR (New)', 'EMEA', 188000, 0, 'Sif Nilsen'],
['Ny Carlsberg Glyptotek - Automated Test Lab 300 devices 1YR (New)', 'EMEA', 212000, 0, 'Nils Peter Bjørnsen'],
['Dunder Mifflin - SCM 2YR (New)', 'Americas', 448000, 50, 'Justin Case']
],
columns: [
{type: 'string', label: 'Opportunity', role: 'domain'},
{type: 'string', label: 'Parent', role: 'data'},
{type: 'number', label: 'Amount', role: 'tooltip'},
{type: 'number', label: 'Score', role: 'data'},
{type: 'string', label: 'Owner', role: 'tooltip'}
],
options: {
minColor: '#f00',
midColor: '#ddd',
maxColor: '#0d0',
headerHeight: 0,
fontFamily: 'Nunito',
fontSize: 13,
fontColor: 'black',
generateTooltip: this._showFullTooltip
},
height: 290,
}
constructor () {
}
_showFullTooltip(row: number, size: number, value: number) {
// This is where I need to get values out of this.chart.data[row]
const amount = size.toLocaleString('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 });
const tooltip = `<div style="color:#fff; background:#313A4B; padding: 10px; border-width:1px; border-style: solid; border-color:#fff;">${amount}</div>`
return tooltip;
}
}
在上面的示例中,传递给回调的参数之一是 row。我需要得到 this.chart.data[row]
。这是行不通的。我认为这是因为回调函数在 Angular 之外工作,但我不确定将 _showFullTooltip() 函数连接到组件属性的最佳方法是什么。
有什么建议吗?
这不是 Angular 问题,而是 JS 作用域问题。不要分配 generateTooltip: this._showFullTooltip
,而是像 generateTooltip: this._showFullTooltip.bind(this)
.
当您传递函数引用时,this
关键字将成为 whoever/whatever 调用该函数的上下文。通过使用 .bind(this)
,您可以使用当前受让人上下文 (DashboardComponent) 覆盖函数调用上下文。这应该允许您在 _showFullTooltip
函数中使用 this.chart.data[row]
。