Ich habe dieses Modul, das die externe Bibliothek zusammen mit zusätzlicher Logik <script>
komponiert, ohne das Tag direkt in die index.html einzufügen:
import 'http://external.com/path/file.js'
//import '../js/file.js'
@Component({
selector: 'my-app',
template: `
<script src="http://iknow.com/this/does/not/work/either/file.js"></script>
<div>Template</div>`
})
export class MyAppComponent {...}
Ich stelle fest, dass die import
von ES6-Spezifikation statisch ist und während des TypeScript-Transpilierens und nicht zur Laufzeit aufgelöst wird.
Wie auch immer, um es konfigurierbar zu machen, damit die Datei file.js entweder aus dem CDN oder aus dem lokalen Ordner geladen wird? Wie kann man Angular 2 anweisen, ein Skript dynamisch zu laden?
javascript
angular
typescript
ecmascript-6
CallMeLaNN
quelle
quelle
Antworten:
Wenn Sie system.js verwenden, können Sie
System.import()
zur Laufzeit Folgendes verwenden :Wenn Sie Webpack verwenden, können Sie die robuste Unterstützung der Codeaufteilung voll ausnutzen mit
require.ensure
:quelle
System
die Zukunft des Laders ist, denke ich.TypeScript Plugin for Sublime Text
ist mitSystem
dem TypeScript-Code nicht zufrieden :Cannot find name 'System'
aber kein Fehler beim Transpilieren und Ausführen. BeideAngular2
und dieSystem
Skriptdatei wurden bereits hinzugefügtindex.html
. Wie dem auch sei , umimport
dasSystem
und das Plugin glücklich zu machen?require()
/import
sollte jetzt als Ihre AntwortMit der folgenden Technik können Sie JS-Skripte und -Bibliotheken bei Bedarf dynamisch in Ihr Angular-Projekt laden.
script.store.ts enthält den Pfad des Skripts entweder lokal oder auf einem Remote-Server und einen Namen , der zum dynamischen Laden des Skripts verwendet wird
script.service.ts ist ein injizierbarer Dienst, der das Laden des Skripts übernimmt und so kopiert,
script.service.ts
wie es istInjizieren Sie dies,
ScriptService
wo immer Sie es brauchen, und laden Sie js libs wie folgtquelle
this.script.load is not a function
Das könnte funktionieren. Dieser Code hängt das
<script>
Tag dynamisch an diehead
angeklickte Schaltfläche der HTML-Datei an.quelle
new Promise
ist aber nicht gelöst. Können Sie mir sagen,Promise
ob ich etwas importieren muss?Ich habe die Antwort von @rahul kumars so geändert, dass stattdessen Observables verwendet werden:
quelle
async
auf einzustellentrue
.private scripts: {ScriptModel}[] = [];
. Es sollte seinprivate scripts: ScriptModel[] = [];
Eine weitere Option wäre die Verwendung eines
scriptjs
Pakets für diese AngelegenheitBeispiel
Installieren Sie das Paket:
und Typdefinitionen für
scriptjs
:Dann Importmethode
$script.get()
:und schließlich die Skriptressource laden, in unserem Fall die Google Maps-Bibliothek:
Demo
quelle
Sie können mehrere Skripte dynamisch wie folgt in Ihre
component.ts
Datei laden :und rufen Sie diese Methode im Konstruktor auf,
Hinweis: Wenn weitere Skripts dynamisch geladen werden sollen, fügen Sie sie dem
dynamicScripts
Array hinzu.quelle
Ich habe dieses Code-Snippet mit der neuen Renderer-API erstellt
Und dann nenne es so
StackBlitz
quelle
Ich habe eine gute Möglichkeit, Skripte dynamisch zu laden! Jetzt verwende ich in meinem Projekt ng6, echarts4 (> 700 KB), ngx-echarts3. Wenn ich sie in den Dokumenten von ngx-echarts verwende, muss ich Echarts in angle.json importieren: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"], also im Anmeldemodul, Seite beim Laden von Skripten .js, das ist eine große Datei! Ich will es nicht
Ich denke also, jedes Modul wird als Datei per Winkel geladen. Ich kann einen Router-Resolver einfügen, um js vorzuladen, und dann mit dem Laden des Moduls beginnen!
// PreloadScriptResolver.service.js
Importieren Sie dann in submodule-routing.module.ts Pr diesen PreloadScriptResolver:
Dieser Code funktioniert gut und verspricht Folgendes: Nachdem die js-Datei geladen wurde, beginnt das Laden des Moduls! Dieser Resolver kann in vielen Routern verwendet werden
quelle
Eine universelle Winkellösung; Ich musste warten, bis ein bestimmtes Element auf der Seite war, bevor ich ein Skript zum Abspielen eines Videos lud.
quelle
Die Lösung von @ rahul-kumar funktioniert gut für mich, aber ich wollte meine Javascript-Funktion in meinem Typoskript aufrufen
Ich habe es behoben, indem ich es in meinem Typoskript deklariert habe:
Und jetzt kann ich foo überall in meiner Typografie-Datei aufrufen
quelle
In meinem Fall habe ich sowohl die
js
als auch diecss
visjs
Dateien mit der oben beschriebenen Technik geladen - was großartig funktioniert. Ich rufe die neue Funktion von aufngOnInit()
Hinweis: Ich konnte es nicht zum Laden bringen, indemicheinfach ein
<script>
und<link>
-Tag zur HTML-Vorlagendateihinzufügte.quelle
Hallo, Sie können Renderer2 und elementRef mit nur wenigen Codezeilen verwenden:
Die
onload
Funktion kann verwendet werden, um die Skriptfunktionen aufzurufen, nachdem das Skript geladen wurde. Dies ist sehr nützlich, wenn Sie die Aufrufe in ngOnInit () ausführen müssen.quelle
@ d123546 Ich hatte das gleiche Problem und konnte es jetzt mit ngAfterContentInit (Lifecycle Hook) in der Komponente wie folgt zum Laufen bringen:
quelle
eine Probe kann sein
Datei script-loader.service.ts
und Verwendung
zuerst injizieren
dann
oder
quelle
quelle