Angular 如何控制SVG模板(点击事件)

How to control SVG template (click events) in Angular

在一个 Angular 项目中,我有一个国家的 SVG 地图,包括它的所有区域, 我正在尝试将此 SVG 地图作为组件的模板。

所以在 SVG 文件中我将每个区域表示为 <path><polygon 元素,总共超过 70 个区域。其中一个要求是用某种颜色突出显示每个点击区域。

有没有办法处理每个区域(<path><polygon 元素)的点击事件,而不是在所有 70 个 <path><polygon 元素,因为这对我来说似乎有很多代码重复

注意:这里我不能在 SVG 元素上使用循环。

我已经在每个 svg 元素上添加了一个点击事件。 当然你不应该自己做,但你可以在你的 dom 元素中以编程方式导航并自动添加点击事件。

我不知道你的代码是怎样的,但这里有一个例子:

<svg #mySvg></svg>

在 component.ts 中也许像这样的东西应该有效:

@ViewChild('mySvg') mySvg: SVGElement;

// other code

const children = this.mySvg.children;
for (var i = 0; i < children.length; i++) {
  const childElement = children[i];
  childElement.addEventListener('click', function (e) {
  // Do stuff
  });
}

根据您的 use-case 使用 ViewChildViewChildren

这有点pseudo-codeish,但它应该可以帮助您入门。

@Component({
  ...
  template: `<svg #map>...<svg>`
})
export class MapComponent implements AfterViewInit {
  @ViewChild('map') map: HTMLElement // or SvgHTMLElement counterpart

  @HostListener('click')
  onMapComponentClicked(event: MouseEvent) {    
    const clickedElement = this.getClickedSvg(event)
    if(!clickedElement) return
    
    // Do something with the clicked SVG; maybe read it's ID
  }

  private getClickedSvg(event: MouseEvent): HTMLElement? {
    return ( 
      Array.from(this.map.children).find(el => el.contains(event.target))
    )
  }

}