„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie kann ich Skripte in Angular mithilfe eines Dienstes dynamisch laden?

Wie kann ich Skripte in Angular mithilfe eines Dienstes dynamisch laden?

Veröffentlicht am 25.11.2024
Durchsuche:150

How Can I Dynamically Load Scripts in Angular Using a Service?

Dynamisches Laden von Skripten in Angular: Eine Lösung

Einführung:

In Angular-Anwendungen besteht die Notwendigkeit, externe Skripte einzubinden entstehen kann. Das direkte Hinzufügen von

Dynamisches Laden von Skripten:

Zum dynamischen Laden Skripts können wir die folgenden Schritte ausführen:

  1. Erstellen Sie einen Skriptspeicher: Erstellen Sie ein Array von Objekten namens ScriptStore, die Skriptpfade und eindeutige Namen für das dynamische Laden enthalten.
  2. Injizieren Sie den Skriptdienst: Implementieren Sie den ScriptService als injizierbaren Angular-Dienst, der das Laden von Skripten verwaltet.
  3. Methode zum Laden von Skripten: Definieren Sie eine Lademethode in ScriptService, um Skripte dynamisch zu laden. Diese Methode verwendet Skriptnamen als Parameter und gibt ein Versprechen zurück.
  4. Implementierung des Skripts laden: Überprüfen Sie innerhalb der Lademethode, ob das Skript bereits geladen ist. Wenn nicht, erstellen Sie ein
  5. Inject and Invoke the Service: Inject ScriptService into the Komponente oder Dienst, in die Sie Skripte laden müssen. Rufen Sie die Lademethode auf, um die gewünschten Skripte zu laden.

Beispielcode:

Unten finden Sie eine Beispielimplementierung des Skriptspeichers und -dienstes:

interface Scripts {
  name: string;
  src: string;
}

// Script store with sample script definitions
export const ScriptStore: Scripts[] = [
  { name: 'filepicker', src: 'https://api.filestackapi.com/filestack.js' },
  { name: 'rangeSlider', src: '../../../assets/js/ion.rangeSlider.min.js' }
];

@Injectable()
export class ScriptService {
  private scripts: any = {};

  constructor() {
    ScriptStore.forEach((script: any) => {
      this.scripts[script.name] = {
        loaded: false,
        src: script.src
      };
    });
  }

  load(...scripts: string[]) {
    var promises: any[] = [];
    scripts.forEach((script) => promises.push(this.loadScript(script)));
    return Promise.all(promises);
  }

  loadScript(name: string) {
    return new Promise((resolve, reject) => {
      // Check if script is already loaded
      if (this.scripts[name].loaded) {
        resolve({ script: name, loaded: true, status: 'Already Loaded' });
      } else {
        let script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = this.scripts[name].src;
        script.onload = () => {
          this.scripts[name].loaded = true;
          resolve({ script: name, loaded: true, status: 'Loaded' });
        };
        script.onerror = (error: any) => resolve({ script: name, loaded: false, status: 'Loaded' });
        document.getElementsByTagName('head')[0].appendChild(script);
      }
    });
  }
}

Verwendung:

In die Komponente oder den Dienst, in den Sie Skripte dynamisch laden möchten, fügen Sie den ScriptService ein. Rufen Sie dann innerhalb einer Methode die Lademethode wie folgt auf:

this.script.load('filepicker', 'rangeSlider').then(data => {
  console.log('script loaded ', data);
}).catch(error => console.log(error));

In diesem Beispiel werden sowohl Filepicker- als auch RangeSlider-Skripte dynamisch geladen. Sie können den ScriptStore jetzt so konfigurieren, dass er Skripte je nach Bedarf entweder von einem CDN oder einem lokalen Ordner lädt.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3