ngx-script-loader icon indicating copy to clipboard operation
ngx-script-loader copied to clipboard

Handling callback url parameter

Open muratcorlu opened this issue 6 years ago • 2 comments

Google Maps JS SDK uses that approach

<div id="map"></div>
    <script>
      var map;
      function initMap() {
        map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: -34.397, lng: 150.644},
          zoom: 8
        });
      }
    </script>
    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
    async defer></script>

Script url accepts a callback parameter as a global function name to trigger it after Google Maps SDK is ready.

So, we need a solution to automate that process.

muratcorlu avatar Apr 30 '18 00:04 muratcorlu

I have a proposal:

const request = {
  url: 'https://maps.googleapis.com/maps/api/js',
  queryParams: {
    key: 'API_KEY',
    callback: () => {
      // Google maps ready
    }
  }
}

this.scriptService.loadScript(request)
  .subscribe(() => {});

So first parameter of loadScript could get a simple string url or a Request object that will have url and queryParams properties.

muratcorlu avatar Apr 30 '18 00:04 muratcorlu

more general question than mentioned here, but it can be handy.

in the official angular google maps lib, they use http.jsonp method to load script lazily programmatically and this jsonp method accepts callback name

https://github.com/angular/components/blob/main/src/google-maps/README.md

// google-maps-demo.component.ts

import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { catchError, map } from 'rxjs/operators';

@Component({
  selector: 'google-maps-demo',
  templateUrl: './google-maps-demo.component.html',
})
export class GoogleMapsDemoComponent {
  apiLoaded: Observable<boolean>;

  constructor(httpClient: HttpClient) {
    // If you're using the `<map-heatmap-layer>` directive, you also have to include the `visualization` library 
    // when loading the Google Maps API. To do so, you can add `&libraries=visualization` to the script URL:
    // https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=visualization

    this.apiLoaded = httpClient.jsonp('https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE', 'callback')
        .pipe(
          map(() => true),
          catchError(() => of(false)),
        );
  }
}

vorant94 avatar Sep 12 '23 07:09 vorant94