J'ai ce module qui compose la bibliothèque externe avec une logique supplémentaire sans ajouter la <script>
balise directement dans l'index.html:
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 {...}
Je remarque que la import
spécification by ES6 est statique et résolue lors du transpiling TypeScript plutôt qu'au moment de l'exécution.
Quoi qu'il en soit, pour le rendre configurable afin que le fichier.js soit chargé à partir du CDN ou du dossier local? Comment dire à Angular 2 de charger un script dynamiquement?
javascript
angular
typescript
ecmascript-6
CallMeLaNN
la source
la source
Réponses:
Si vous utilisez system.js, vous pouvez utiliser
System.import()
au moment de l'exécution:Si vous utilisez webpack, vous pouvez profiter pleinement de son support robuste de fractionnement de code avec
require.ensure
:la source
System
c'est l'avenir du chargeur, je pense.TypeScript Plugin for Sublime Text
ne satisfait pasSystem
dans le code TypeScript:Cannot find name 'System'
mais aucune erreur lors du transpiling et de l'exécution. Les deuxAngular2
et leSystem
fichier de script ont déjà été ajoutés dansindex.html
. Quoi qu'il en soit àimport
laSystem
et faire le plaisir de plug - in?require()
/import
devrait bien fonctionner comme votre réponse maintenant, +1Vous pouvez utiliser la technique suivante pour charger dynamiquement des scripts et des bibliothèques JS à la demande dans votre projet Angular.
script.store.ts contiendra le chemin du script localement ou sur un serveur distant et un nom qui sera utilisé pour charger le script dynamiquement
script.service.ts est un service injectable qui gérera le chargement du script, copié
script.service.ts
tel quelInjectez-le
ScriptService
partout où vous en avez besoin et chargez des bibliothèques js comme cecila source
this.script.load is not a function
Cela pourrait fonctionner. Ce code ajoute dynamiquement la
<script>
balise auhead
fichier html sur le bouton cliqué.la source
new Promise
n'est pas résolu. Pouvez-vous me dire carPromise
dois-je importer quelque chose?J'ai modifié la réponse de @rahul kumars, afin qu'elle utilise Observables à la place:
la source
async
surtrue
.private scripts: {ScriptModel}[] = [];
. Ça devrait êtreprivate scripts: ScriptModel[] = [];
Encore une autre option serait d'utiliser le
scriptjs
package pour cette question quiExemple
Installez le package:
et définitions de type pour
scriptjs
:Puis
$script.get()
méthode d' importation :et enfin charger la ressource de script, dans notre cas la bibliothèque Google Maps:
Démo
la source
Vous pouvez charger plusieurs scripts dynamiquement comme ceci dans votre
component.ts
fichier:et appelez cette méthode dans le constructeur,
Remarque: pour que plus de scripts soient chargés dynamiquement, ajoutez-les au
dynamicScripts
tableau.la source
J'ai fait cet extrait de code avec la nouvelle API de rendu
Et puis appelle ça comme ça
StackBlitz
la source
J'ai un bon moyen de charger dynamiquement des scripts! J'utilise maintenant ng6, echarts4 (> 700Kb), ngx-echarts3 dans mon projet. quand je les utilise par les docs de ngx-echarts, j'ai besoin d'importer des echarts dans angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"] donc dans le module de connexion, page lors du chargement des scripts .js, c'est un gros fichier! Je n'en veux pas.
Donc, je pense que angular charge chaque module sous forme de fichier, je peux insérer un résolveur de routeur pour précharger js, puis commencer le chargement du module!
// PreloadScriptResolver.service.js
Puis dans le submodule-routing.module.ts , importez ce PreloadScriptResolver:
Ce code fonctionne bien, et il promet que: Une fois le fichier js chargé, le module commence le chargement! ce résolveur peut utiliser dans de nombreux routeurs
la source
Une solution universelle angulaire; J'avais besoin d'attendre qu'un élément particulier soit sur la page avant de charger un script pour lire une vidéo.
la source
La solution de @ rahul-kumar fonctionne bien pour moi, mais je voulais appeler ma fonction javascript dans mon manuscrit
Je l'ai corrigé en le déclarant dans mon manuscrit:
Et maintenant, je peux appeler foo n'importe où dans mon fichier typecript
la source
Dans mon cas, j'ai chargé les fichiers
js
etcss
visjs
en utilisant la technique ci-dessus - qui fonctionne très bien. J'appelle la nouvelle fonction dengOnInit()
Remarque: je n'ai pas pu le charger en ajoutant simplement unebalise
<script>
et<link>
au fichier de modèle html.la source
Bonjour, vous pouvez utiliser Renderer2 et elementRef avec seulement quelques lignes de code:
la
onload
fonction peut être utilisée pour appeler les fonctions de script après le chargement du script, c'est très utile si vous devez faire les appels dans le ngOnInit ()la source
@ d123546 J'ai rencontré le même problème et je l'ai fait fonctionner maintenant en utilisant ngAfterContentInit (Lifecycle Hook) dans le composant comme ceci:
la source
la source
un échantillon peut être
fichier script-loader.service.ts
et utilisation
première injection
puis
ou
la source