Eu tenho este módulo que componente a biblioteca externa junto com lógica adicional sem adicionar a <script>
tag diretamente no 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 {...}
Eu percebo o import
especificação do ES6 é estática e resolvida durante a transpilação do TypeScript em vez de em tempo de execução.
De qualquer forma, para configurá-lo para que o file.js seja carregado na CDN ou na pasta local? Como dizer ao Angular 2 para carregar um script dinamicamente?
javascript
angular
typescript
ecmascript-6
CallMeLaNN
fonte
fonte
Respostas:
Se você estiver usando system.js, poderá usar
System.import()
em tempo de execução:Se você estiver usando o webpack, poderá aproveitar ao máximo seu robusto suporte à divisão de código com
require.ensure
:fonte
System
é o futuro do carregador, eu acho.TypeScript Plugin for Sublime Text
não está satisfeito comSystem
o código TypeScript:Cannot find name 'System'
mas nenhum erro durante a transpilação e a execução. O arquivo de scriptAngular2
eSystem
já foi adicionadoindex.html
. De qualquer maneira paraimport
oSystem
e tornar o feliz plugin?require()
/import
deve funcionar bem como a sua resposta agora, +1Você pode usar a técnica a seguir para carregar dinamicamente scripts JS e bibliotecas sob demanda no seu projeto Angular.
script.store.ts conterá o caminho do script localmente ou em um servidor remoto e um nome que será usado para carregar o script dinamicamente
O script.service.ts é um serviço injetável que manipulará o carregamento do script, copie
script.service.ts
como estáInjete isso
ScriptService
sempre que precisar e carregue js libs como estefonte
this.script.load is not a function
Isso pode funcionar. Este código anexa dinamicamente a
<script>
tag aohead
arquivo html no botão clicado.fonte
new Promise
não foi resolvido. Você pode me dizer porPromise
que devo importar alguma coisa?Modifiquei a resposta @rahul kumars, para que ele use Observables:
fonte
async
comotrue
.private scripts: {ScriptModel}[] = [];
. Deveria serprivate scripts: ScriptModel[] = [];
Ainda outra opção seria utilizar
scriptjs
pacotes para esse assunto queExemplo
Instale o pacote:
e definições de tipo para
scriptjs
:Em seguida, importe o
$script.get()
método:e finalmente carregar o recurso de script, no nosso caso, a biblioteca do Google Maps:
Demo
fonte
Você pode carregar vários scripts dinamicamente como este em seu
component.ts
arquivo:e chame esse método dentro do construtor,
Nota: Para que mais scripts sejam carregados dinamicamente, adicione-os à
dynamicScripts
matriz.fonte
Eu fiz esse trecho de código com a nova API do renderizador
E então chame assim
StackBlitz
fonte
Eu tenho uma boa maneira de carregar scripts dinamicamente! Agora eu uso ng6, echarts4 (> 700Kb), ngx-echarts3 no meu projeto. quando os uso pelos documentos da ngx-echarts, preciso importar echarts no angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"], portanto, no módulo de login, na página ao carregar scripts .js, esse é um arquivo grande! Eu não quero isso
Então, acho que o angular carrega cada módulo como um arquivo, posso inserir um resolvedor de roteador para pré-carregar o js e começar o carregamento do módulo!
// PreloadScriptResolver.service.js
Em submodule-routing.module.ts, importe este PreloadScriptResolver:
Esse código funciona bem e promete que: Após o arquivo js ser carregado, o módulo começa a ser carregado! este resolvedor pode usar em muitos roteadores
fonte
Uma solução universal angular; Eu precisava esperar que um elemento específico estivesse na página antes de carregar um script para reproduzir um vídeo.
fonte
A solução do @ rahul-kumar funciona bem para mim, mas eu queria chamar minha função javascript no meu texto datilografado
Corrigi-o declarando-o no meu texto datilografado:
E agora, eu posso chamar foo em qualquer lugar do meu arquivo de digitação
fonte
No meu caso, carreguei os arquivos
js
ecss
visjs
usando a técnica acima - o que funciona muito bem. Eu chamo a nova função dengOnInit()
Nota: eu poderia não fazê-lo de carga, simplesmente adicionando um
<script>
e<link>
tag ao arquivo de modelo html.fonte
Oi, você pode usar o Renderer2 e o elementRef com apenas algumas linhas de código:
a
onload
função pode ser usada para chamar as funções de script após o carregamento do script, isso é muito útil se você precisar fazer as chamadas no ngOnInit ()fonte
@ d123546 Enfrentei o mesmo problema e o fiz funcionar agora usando o ngAfterContentInit (Lifecycle Hook) no componente como este:
fonte
fonte
uma amostra pode ser
arquivo script-loader.service.ts
e uso
primeiro injetar
então
ou
fonte