How to load external scripts dynamically in Angular?

前端 未结 15 1067
被撕碎了的回忆
被撕碎了的回忆 2020-11-22 06:48

I have this module which componentize the external library together with additional logic without adding the

15条回答
  •  猫巷女王i
    2020-11-22 06:56

    I have modified @rahul kumars answer, so that it uses Observables instead:

    import { Injectable } from "@angular/core";
    import { Observable } from "rxjs/Observable";
    import { Observer } from "rxjs/Observer";
    
    @Injectable()
    export class ScriptLoaderService {
        private scripts: ScriptModel[] = [];
    
        public load(script: ScriptModel): Observable {
            return new Observable((observer: Observer) => {
                var existingScript = this.scripts.find(s => s.name == script.name);
    
                // Complete if already loaded
                if (existingScript && existingScript.loaded) {
                    observer.next(existingScript);
                    observer.complete();
                }
                else {
                    // Add the script
                    this.scripts = [...this.scripts, script];
    
                    // Load the script
                    let scriptElement = document.createElement("script");
                    scriptElement.type = "text/javascript";
                    scriptElement.src = script.src;
    
                    scriptElement.onload = () => {
                        script.loaded = true;
                        observer.next(script);
                        observer.complete();
                    };
    
                    scriptElement.onerror = (error: any) => {
                        observer.error("Couldn't load script " + script.src);
                    };
    
                    document.getElementsByTagName('body')[0].appendChild(scriptElement);
                }
            });
        }
    }
    
    export interface ScriptModel {
        name: string,
        src: string,
        loaded: boolean
    }
    

提交回复
热议问题