From fbfdceeea6b75da3f4e685bc3bb1fa38fe8828fd Mon Sep 17 00:00:00 2001 From: shenron Date: Sat, 14 Feb 2026 14:59:20 -0500 Subject: [PATCH] Fix: Add change detection and prevent duplicate event listeners --- src/app/map-svg/map-svg.ts | 14 +++++++++++--- src/app/map/map.ts | 13 +++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/app/map-svg/map-svg.ts b/src/app/map-svg/map-svg.ts index 95da2d1..27ecd13 100644 --- a/src/app/map-svg/map-svg.ts +++ b/src/app/map-svg/map-svg.ts @@ -8,6 +8,7 @@ import { Component, Output, EventEmitter, AfterViewInit, ElementRef } from '@ang }) export class MapSvgComponent implements AfterViewInit { @Output() countryClick = new EventEmitter(); + private handlersAttached = false; constructor(private elementRef: ElementRef) {} @@ -16,7 +17,9 @@ export class MapSvgComponent implements AfterViewInit { if (objectElement) { objectElement.addEventListener('load', () => { - this.attachClickHandlers(); + if (!this.handlersAttached) { + this.attachClickHandlers(); + } }); } } @@ -39,10 +42,12 @@ export class MapSvgComponent implements AfterViewInit { path.setAttribute('class', 'country-path'); path.setAttribute('style', 'cursor: pointer;'); - path.addEventListener('click', () => { + const clickHandler = () => { console.log(`Clicked country: ${countryCode}`); this.countryClick.emit(countryCode.toUpperCase()); - }); + }; + + path.addEventListener('click', clickHandler, { once: false }); path.addEventListener('mouseenter', () => { (path as SVGPathElement).style.fill = '#3498db'; @@ -55,5 +60,8 @@ export class MapSvgComponent implements AfterViewInit { }); } }); + + this.handlersAttached = true; + console.log('Click handlers attached successfully'); } } diff --git a/src/app/map/map.ts b/src/app/map/map.ts index 58ef06a..ebb1653 100644 --- a/src/app/map/map.ts +++ b/src/app/map/map.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectorRef } from '@angular/core'; import { CommonModule } from '@angular/common'; import { WorldBankService, CountryData } from '../services/world-bank'; import { MapSvgComponent } from '../map-svg/map-svg'; @@ -14,24 +14,33 @@ export class MapComponent { loading: boolean = false; error: string | null = null; - constructor(private worldBankService: WorldBankService) {} + constructor( + private worldBankService: WorldBankService, + private cdr: ChangeDetectorRef + ) {} onCountrySelected(countryCode: string): void { console.log('Country selected:', countryCode); + console.log('Current state - loading:', this.loading, 'countryData:', this.countryData); + this.loading = true; this.error = null; this.countryData = null; + this.cdr.detectChanges(); this.worldBankService.getCountryData(countryCode).subscribe({ next: (data) => { console.log('Received data:', data); this.countryData = data; this.loading = false; + console.log('Updated state - loading:', this.loading, 'countryData:', this.countryData); + this.cdr.detectChanges(); }, error: (err) => { console.error('API Error:', err); this.error = 'Failed to load country data'; this.loading = false; + this.cdr.detectChanges(); } }); }