Saya memiliki modul ini yang memompilisasi perpustakaan eksternal bersama dengan logika tambahan tanpa menambahkan <script>
tag langsung ke 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 {...}
Saya melihat bahwa import
dengan ES6 spec statis dan diselesaikan selama pengalihan TypeScript daripada saat runtime.
Pokoknya untuk membuatnya dapat dikonfigurasi sehingga file.js akan memuat baik dari CDN atau folder lokal? Bagaimana cara memberitahu Angular 2 untuk memuat skrip secara dinamis?
javascript
angular
typescript
ecmascript-6
CallMeLaNN
sumber
sumber
Jawaban:
Jika Anda menggunakan system.js, Anda dapat menggunakan
System.import()
saat runtime:Jika Anda menggunakan webpack, Anda dapat memanfaatkan sepenuhnya dukungan pemisahan kode yang kuat dengan
require.ensure
:sumber
System
adalah masa depan loader, saya pikir.TypeScript Plugin for Sublime Text
tidak senang denganSystem
dalam kode TypeScript:Cannot find name 'System'
tetapi tidak ada kesalahan selama pengubahan dan pengoperasian. File skripAngular2
dan keduanyaSystem
sudah ditambahkanindex.html
. Pokoknya untukimport
yangSystem
dan membuat bahagia Plugin?require()
/import
harus bekerja dengan baik sebagai jawaban Anda sekarang, 1Anda dapat menggunakan teknik berikut untuk secara dinamis memuat skrip JS dan perpustakaan sesuai permintaan di proyek Angular Anda.
script.store.ts akan berisi lintasan skrip secara lokal atau pada server jarak jauh dan nama yang akan digunakan untuk memuat skrip secara dinamis
script.service.ts adalah layanan injeksi yang akan menangani pemuatan skrip, salin
script.service.ts
apa adanyaSuntikkan ini di
ScriptService
mana pun Anda membutuhkannya dan muat js libs seperti inisumber
this.script.load is not a function
Ini mungkin berhasil. Kode ini secara dinamis menambahkan
<script>
tag kehead
file html pada tombol yang diklik.sumber
new Promise
tidak terselesaikan. Bisakah Anda memberi tahu sayaPromise
apakah saya harus mengimpor sesuatu?Saya telah memodifikasi jawaban @rahul kumars, sehingga ia menggunakan Observables sebagai gantinya:
sumber
async
untuktrue
.private scripts: {ScriptModel}[] = [];
. Seharusnyaprivate scripts: ScriptModel[] = [];
Namun pilihan lain adalah menggunakan
scriptjs
paket untuk hal ituContoh
Instal paket:
dan ketik definisi untuk
scriptjs
:Kemudian
$script.get()
metode impor :dan akhirnya memuat sumber skrip, dalam perpustakaan Google Maps kasus kami:
Demo
sumber
Anda dapat memuat beberapa skrip secara dinamis seperti ini di
component.ts
file Anda :dan memanggil metode ini di dalam konstruktor,
Catatan: Agar skrip lainnya dimuat secara dinamis, tambahkan skrip ke
dynamicScripts
array.sumber
Saya telah melakukan potongan kode ini dengan api penyaji baru
Dan kemudian menyebutnya seperti ini
StackBlitz
sumber
Saya memiliki cara yang baik untuk memuat skrip secara dinamis! Sekarang saya menggunakan ng6, echarts4 (> 700Kb), ngx-echarts3 dalam proyek saya. ketika saya menggunakannya oleh ngx-echarts's docs, saya perlu mengimpor echarts di angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"] sehingga dalam modul login, halaman saat memuat skrip .js, ini file besar! Saya tidak menginginkannya.
Jadi, saya pikir sudut memuat setiap modul sebagai file, saya dapat memasukkan resolver router untuk preload js, kemudian mulai memuat modul!
// PreloadScriptResolver.service.js
Kemudian di submodule-routing.module.ts , impor PreloadScriptResolver ini:
Kode ini berfungsi dengan baik, dan menjanjikan bahwa: Setelah file js dimuat, maka modul mulai memuat! Penyelesai ini dapat digunakan di banyak router
sumber
Solusi universal sudut; Saya perlu menunggu elemen tertentu berada di halaman sebelum memuat skrip untuk memutar video.
sumber
Solusi @ rahul-kumar bekerja baik untuk saya, tetapi saya ingin memanggil fungsi javascript saya dalam naskah saya
Saya memperbaikinya dengan mendeklarasikannya dalam naskah saya:
Dan sekarang, saya bisa menelepon foo di mana saja di file typecript saya
sumber
Dalam kasus saya, saya telah memuat file
js
dancss
visjs
menggunakan teknik di atas - yang bekerja sangat baik. Saya memanggil fungsi baru daringOnInit()
Catatan: Saya tidak bisa memuatnya dengan hanya menambahkan
<script>
dan<link>
tag ke file template html.sumber
Hai Anda dapat menggunakan Renderer2 dan elementRef hanya dengan beberapa baris kode:
yang
onload
fungsi dapat digunakan untuk memanggil fungsi script setelah script dimuat, ini sangat berguna jika Anda harus melakukan panggilan di ngOnInit ()sumber
@ d123546 Saya menghadapi masalah yang sama dan mulai bekerja sekarang menggunakan ngAfterContentInit (Lifecycle Hook) pada komponen seperti ini:
sumber
sumber
sebuah sampel bisa
file script-loader.service.ts
dan penggunaan
suntikan pertama
kemudian
atau
sumber