Tengo este módulo que compone la biblioteca externa junto con lógica adicional sin agregar la <script>
etiqueta directamente en el 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 {...}
Me he dado cuenta de la import
especificación por ES6 es estática y se resolvieron durante el mecanografiado transpiling en lugar de en tiempo de ejecución.
¿De todos modos para que sea configurable para que el archivo.js se cargue desde CDN o carpeta local? ¿Cómo decirle a Angular 2 que cargue un script dinámicamente?
javascript
angular
typescript
ecmascript-6
CallMeLaNN
fuente
fuente
Respuestas:
Si usa system.js, puede usar
System.import()
en tiempo de ejecución:Si usa webpack, puede aprovechar al máximo su sólido soporte de división de código con
require.ensure
:fuente
System
es el futuro del cargador, creo.TypeScript Plugin for Sublime Text
no está satisfecho conSystem
el código TypeScript:Cannot find name 'System'
pero no hay error durante la transpiración y ejecución. TantoAngular2
ySystem
archivo de script ya agrega enindex.html
. De todas formas paraimport
elSystem
y hacer que el plug-in feliz?require()
/import
debería funcionar bien como su respuesta ahora, 1Puede usar la siguiente técnica para cargar dinámicamente scripts y bibliotecas JS a pedido en su proyecto Angular.
script.store.ts contendrá la ruta del script localmente o en un servidor remoto y un nombre que se usará para cargar el script dinámicamente
script.service.ts es un servicio inyectable que se encargará de cargar el script, copiarlo
script.service.ts
tal como estáInyecte esto
ScriptService
donde lo necesite y cargue bibliotecas js como estafuente
this.script.load is not a function
Esto podría funcionar. Este código agrega dinámicamente la
<script>
etiqueta alhead
archivo html al hacer clic en el botón.fuente
new Promise
no está resuelto. ¿Me puede decirPromise
si debo importar algo?He modificado la respuesta de @rahul kumars, para que use Observables en su lugar:
fuente
async
atrue
.private scripts: {ScriptModel}[] = [];
. Debería serprivate scripts: ScriptModel[] = [];
Otra opción más sería utilizar el
scriptjs
paquete para el caso queEjemplo
Instala el paquete:
y definiciones de tipo para
scriptjs
:Luego
$script.get()
método de importación :y finalmente cargar el recurso de script, en nuestro caso la biblioteca de Google Maps:
Manifestación
fuente
Puede cargar múltiples scripts dinámicamente como este en su
component.ts
archivo:y llama a este método dentro del constructor,
Nota: Para que se carguen más scripts dinámicamente, agréguelos a la
dynamicScripts
matriz.fuente
He hecho este fragmento de código con la nueva API de renderizador
Y luego llámalo así
StackBlitz
fuente
¡Tengo una buena forma de cargar scripts dinámicamente! Ahora uso ng6, echarts4 (> 700Kb), ngx-echarts3 en mi proyecto. cuando los uso en los documentos de ngx-echarts, necesito importar echarts en angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"] por lo tanto en el módulo de inicio de sesión, página mientras se cargan los scripts .js, este es un archivo grande! No lo quiero
Entonces, creo que angular carga cada módulo como un archivo, puedo insertar un enrutador para precargar js, ¡y luego comenzar la carga del módulo!
// PreloadScriptResolver.service.js
Luego, en submodule-routing.module.ts, importe este PreloadScriptResolver:
Este código funciona bien y promete que: ¡Después de cargar el archivo js, el módulo comenzará a cargar! este Resolver puede usar en muchos enrutadores
fuente
Una solución universal angular; Necesitaba esperar a que un elemento en particular estuviera en la página antes de cargar un script para reproducir un video.
fuente
La solución de @ rahul-kumar funciona bien para mí, pero quería llamar a mi función javascript en mi mecanografiado
Lo arreglé declarándolo en mi mecanografiado:
Y ahora, puedo llamar a foo en cualquier parte de mi archivo de mecanografía
fuente
En mi caso, he cargado los archivos
js
ycss
visjs
utilizando la técnica anterior, que funciona muy bien. Llamo a la nueva función desdengOnInit()
Nota: Podría no conseguir que se carga mediante la simple adición de una
<script>
y<link>
etiqueta para el archivo de plantilla HTML.fuente
Hola, puedes usar Renderer2 y elementRef con solo unas pocas líneas de código:
la
onload
función se puede usar para llamar a las funciones del script después de cargar el script, esto es muy útil si tiene que hacer las llamadas en ngOnInit ()fuente
@ d123546 Me enfrenté al mismo problema y lo puse a funcionar ahora usando ngAfterContentInit (Lifecycle Hook) en el componente de esta manera:
fuente
fuente
una muestra puede ser
archivo script-loader.service.ts
y uso
primera inyección
luego
o
fuente