Questa soluzione è adatta se si utilizza il routing. È possibile creare un Resolver
che inizializzerà e risolverà l'oggetto google
, che è possibile iniettare nel componente.
In primo luogo è necessario aggiungere la riga seguente alla fine del index.html
// index.html
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
Quindi è necessario creare un Resolver
dicono, di nome GoogleChartResolver
.
// shared/google-chart.resolver.ts
declare const google: any;
@Injectable()
export class GoogleChartResolver implements Resolve<any>{
private static googleChartLoaded: boolean = false;
constructor() {}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if(GoogleChartResolver.googleChartLoaded){
return Observable.of(google);
} else {
return Observable.create(function (observer: Observer<any>) {
google.charts.load('current', {packages: ['corechart', 'bar']});
google.charts.setOnLoadCallback(() => {
observer.next(google);
observer.complete();
GoogleChartResolver.googleChartLoaded = true;
});
});
}
}
}
Per ogni percorso e componenti è necessario un'istanza di google
, è possibile aggiungere le righe che seguono. È necessario aggiungere il GoogleChartResolver
alla lista di osservabili da risolvere per il percorso,
// app-routing.module.ts
{path: 'my-path', component: MyComponent, resolve: {google: GoogleChartResolver}}
Nel MyComponent
si può inejct ActivatedRoute
e ottenere l'istanza del google
dalla snapshot
// my.component.ts
private google: any;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.google = this.route.snapshot.data.google;
drawChart(this.google)
}
Tutto il le risorse dipendenti per i grafici di Google verranno caricate durante la prima volta che proverai a risolvere il Resolver (qui, la prima volta che visiti lo /my-path
). Nelle risoluzioni successive, viene restituito l'oggetto già risolto (non è richiesto alcun recupero di risorse). Anche questo approccio carica tutti i pacchetti di grafici contemporaneamente. Se è necessario ottimizzare ulteriormente, è possibile caricare diversi pacchetti di grafici utilizzando diversi risolutori, ma potrebbe essere eccessivo, una soluzione per questo sarà, invece di creare classi Resolver
, è possibile ottenere la route resolve
utilizzando il metodo di riferimento (ad esempio crea un metodo statico in un servizio che fa la stessa cosa).
hai provato qualcosa? –
Riesci a mettere giù il codice che ti stanca? –