Mam taki moduł, który komponuje zewnętrzną bibliotekę wraz z dodatkową logiką bez dodawania <script>
tagu bezpośrednio do 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 {...}
Zauważyłem, że import
specyfikacja ES6 jest statyczna i rozwiązana podczas transpilacji TypeScript, a nie w czasie wykonywania.
W każdym razie, aby był konfigurowalny, aby plik.js był ładowany z CDN lub folderu lokalnego? Jak powiedzieć Angularowi 2, aby ładował skrypt dynamicznie?
javascript
angular
typescript
ecmascript-6
CallMeLaNN
źródło
źródło
Odpowiedzi:
Jeśli używasz system.js, możesz użyć
System.import()
w czasie wykonywania:Jeśli używasz pakietu webpack, możesz w pełni wykorzystać jego solidną obsługę dzielenia kodu dzięki
require.ensure
:źródło
System
, bo myślę , że to przyszłość programu ładującego.TypeScript Plugin for Sublime Text
nie jest zadowolony zSystem
w kodzie TypeScript:Cannot find name 'System'
ale nie ma błędu podczas transpilacji i uruchamiania. Zarówno plik skryptu, jakAngular2
iSystem
plik skryptu już zostały dodane doindex.html
. W każdym razie do i uczynić szczęśliwą wtyczki?import
System
require()
/import
powinno teraz działać dobrze jako twoja odpowiedź, +1Możesz użyć następującej techniki, aby dynamicznie ładować skrypty JS i biblioteki na żądanie w swoim projekcie Angular.
script.store.ts będzie zawierać ścieżkę do skryptu lokalnie lub na serwerze zdalnym oraz nazwę, która będzie używana do dynamicznego ładowania skryptu
script.service.ts to usługa do wstrzykiwania, która obsługuje ładowanie skryptu, kopiowanie
script.service.ts
w takiej postaci, w jakiej jestWstrzykuj to w
ScriptService
dowolnym miejscu i ładuj biblioteki js w ten sposóbźródło
this.script.load is not a function
To może zadziałać. Ten kod dynamicznie dołącza
<script>
znacznik dohead
pliku HTML po kliknięciu przycisku.źródło
new Promise
nie został rozwiązany. Czy możesz mi powiedziećPromise
, czy muszę cokolwiek importować?Zmodyfikowałem odpowiedź @rahul kumars, aby zamiast tego używała Observables:
źródło
async
totrue
.private scripts: {ScriptModel}[] = [];
. Powinno byćprivate scripts: ScriptModel[] = [];
Jeszcze inną opcją byłoby wykorzystanie
scriptjs
pakietu do tego celuPrzykład
Zainstaluj pakiet:
i definicje typów dla
scriptjs
:Następnie
$script.get()
metoda importu :i na koniec załaduj zasób skryptu, w naszym przypadku bibliotekę Google Maps:
Próbny
źródło
W swoim pliku możesz dynamicznie ładować wiele skryptów, takich jak ten
component.ts
:i wywołaj tę metodę wewnątrz konstruktora,
Uwaga: Aby więcej skryptów było ładowanych dynamicznie, dodaj je do
dynamicScripts
tablicy.źródło
Zrobiłem ten fragment kodu z nowym interfejsem API modułu renderującego
A potem nazwij to tak
StackBlitz
źródło
Mam dobry sposób na dynamiczne ładowanie skryptów! Teraz używam w moim projekcie ng6, echarts4 (> 700Kb), ngx-echarts3. kiedy używam ich w dokumentach ngx-echarts, potrzebuję importu echarts w angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"], więc w module logowania, strona podczas ładowania skryptów .js, to jest duży plik! Nie chcę tego.
Myślę więc, że kątowe ładuje każdy moduł jako plik, mogę wstawić program rozpoznawania nazw routera, aby wstępnie załadować js, a następnie rozpocząć ładowanie modułu!
// PreloadScriptResolver.service.js
Następnie w submodule-routing.module.ts , zaimportuj ten PreloadScriptResolver:
Ten kod działa dobrze i obiecuje, że: Po załadowaniu pliku js rozpocznie się ładowanie modułu! ten Resolver może być używany w wielu routerach
źródło
Uniwersalne rozwiązanie Angular; Musiałem poczekać, aż określony element pojawi się na stronie, zanim załaduję skrypt, aby odtworzyć wideo.
źródło
Rozwiązanie @ rahul-kumar działa dobrze dla mnie, ale chciałem wywołać moją funkcję javascript w moim skrypcie
Naprawiłem to, deklarując to w moim maszynopisie:
A teraz mogę zadzwonić do foo w dowolnym miejscu w moim pliku typekryptu
źródło
W moim przypadku załadowałem oba pliki
js
icss
visjs
używając powyższej techniki - która działa świetnie. Wzywam nową funkcję zngOnInit()
Uwaga: nie udało mi się go załadować, po prostu dodającznacznik
<script>
i<link>
do pliku szablonu html.źródło
Cześć, możesz użyć Renderer2 i elementRef z zaledwie kilkoma wierszami kodu:
onload
funkcja może być używany do wywołania funkcji skryptowych po załadowaniu skryptu, jest to bardzo przydatne, gdy trzeba wykonać połączenia w ngOnInit ()źródło
@ d123546 Napotkałem ten sam problem i uruchomiłem go teraz, używając ngAfterContentInit (Lifecycle Hook) w komponencie takim jak ten:
źródło
źródło
próbka może być
plik script-loader.service.ts
i użytkowania
pierwsze wstrzyknięcie
następnie
lub
źródło