Saya ingin mengkompilasi beberapa arahan berisi HTML secara manual. Apa yang setara dengan $compile
di Angular 2?
Misalnya, dalam Angular 1, saya dapat secara dinamis mengkompilasi sebuah fragmen HTML dan menambahkannya ke DOM:
var e = angular.element('<div directive></div>');
element.append(e);
$compile(e)($scope);
Jawaban:
Angular 2.3.0 (2016-12-07)
Untuk mendapatkan semua detailnya periksa:
Untuk melihatnya dalam aksi:
Kepala sekolah:
1) Buat Template
2) Buat Komponen
3) Buat Modul
4) Kompilasi Modul
5) Buat (dan cache) ComponentFactory
6) gunakan Target untuk membuat Instance dari itu
Tinjauan singkat cara membuat Komponen
Cara cara menyuntikkan komponen ke NgModule
Cuplikan kode cara membuat
ComponentFactory
(dan menyimpannya)Cuplikan kode cara menggunakan hasil di atas
Deskripsi lengkap dengan semua perinciannya baca di sini , atau amati contoh kerja
.
.
sumber
ComponentFactory
danViewContainerRef
untuk menggantikan DynamicComponentLoader yang sekarang sudah tidak digunakan lagi.$compile($element.contents())($scope.$new());
dan sekarang ini ratusan baris kode, lengkap dengan kreasi NgModule ... Ini adalah jenis hal yang membuat saya ingin menghindari NG2 dan beralih ke sesuatu yang lebih baik.JitCompiler
jika misalnya Anda mungkin bekerja denganCompiler
dari@angular/core
? plnkr.co/edit/UxgkiT?p=previewCatatan: Seperti @BennyBottema menyebutkan dalam komentar, DynamicComponentLoader sekarang sudah usang, maka demikian pula jawaban ini.
Angular2 tidak memiliki $ kompilasi yang setara. Anda dapat menggunakan
DynamicComoponentLoader
dan meretas dengan kelas ES6 untuk mengkompilasi kode Anda secara dinamis (lihat bungkusan ini ):Tetapi ini hanya akan berfungsi sampai html parser ada di dalam angular2 core.
sumber
DynamicComponentLoader
sudah usang, bagaimana kita melakukan hal yang sama di Angular 2? Katakanlah saya memiliki dialog modal dan saya ingin secara dinamis memuat komponen baru karena isinyaVersi Sudut yang Saya Gunakan - Sudut 4.2.0
Angular 4 muncul dengan ComponentFactoryResolver untuk memuat komponen saat runtime. Ini adalah jenis implementasi yang sama dari $ compile di Angular 1.0 yang melayani kebutuhan Anda
Dalam contoh di bawah ini saya memuat komponen ImageWidget secara dinamis ke DashboardTileComponent
Untuk memuat komponen, Anda memerlukan arahan yang dapat Anda terapkan ke ng-template yang akan membantu menempatkan komponen dinamis
WidgetHostDirective
arahan ini menyuntikkan ViewContainerRef untuk mendapatkan akses ke wadah tampilan elemen yang akan menjadi tuan rumah komponen yang ditambahkan secara dinamis.
DashboardTileComponent (Komponen dudukan untuk merender komponen dinamis)
Komponen ini menerima input yang berasal dari komponen induk atau Anda dapat memuat dari layanan Anda berdasarkan implementasi Anda. Komponen ini melakukan peran utama untuk menyelesaikan komponen saat runtime. Dalam metode ini Anda juga dapat melihat metode bernama renderComponent () yang akhirnya memuat nama komponen dari layanan dan menyelesaikannya dengan ComponentFactoryResolver dan akhirnya menyetel data ke komponen dinamis.
DashboardTileComponent.html
WidgetComponentService
Ini adalah pabrik layanan untuk mendaftarkan semua komponen yang ingin Anda selesaikan secara dinamis
ImageTextWidgetComponent (komponen kami memuat saat runtime)
Tambahkan Akhirnya tambahkan ImageTextWidgetComponent ini ke dalam modul aplikasi Anda sebagai entryComponent
TileModel
Referensi Asli dari blog saya
Dokumentasi Resmi
Unduh Kode Sumber Sampel
sumber
entryComponents
. Tanpanya solusi Anda tidak akan berfungsipaket npm ini memudahkan saya: https://www.npmjs.com/package/ngx-dynamic-template
pemakaian:
sumber
Untuk membuat instance komponen secara dinamis dan melampirkannya ke DOM Anda, Anda dapat menggunakan skrip berikut dan bekerja di Angular RC :
template html:
Komponen pemuat
sumber
Angular TypeScript / ES6 (Angular 2+)
Bekerja dengan AOT + JIT sekaligus bersama-sama.
Saya membuat cara menggunakannya di sini: https://github.com/patrikx3/angular-compile
Komponen: Seharusnya memiliki konteks dan beberapa data html ...
Html:
sumber
$compile(...)($scope)
. Tidak ada apa pun di dalamnya bahkan dalam repo readme.Anda dapat melihat komponennya, yang memungkinkan untuk menyusun komponen Angular dinamis sederhana https://www.npmjs.com/package/@codehint-ng/html-compiler
sumber
Saya tahu masalah ini sudah tua, tetapi saya menghabiskan waktu berminggu-minggu mencoba mencari cara untuk membuat pekerjaan ini dengan AOT diaktifkan. Saya dapat mengkompilasi objek tetapi tidak pernah dapat menjalankan komponen yang ada. Yah saya akhirnya memutuskan untuk mengubah kebijaksanaan, karena saya tidak mencari untuk mengkompilasi kode sebanyak mengeksekusi templat kustom. Pikir saya adalah untuk menambahkan html yang dapat dilakukan siapa saja dan loop melalui pabrik yang ada. Dengan melakukan itu saya dapat mencari elemen / atribut / etc. nama dan jalankan komponen pada HTMLElement itu. Saya bisa membuatnya bekerja dan berpikir saya harus membagikan ini untuk menyelamatkan orang lain berapa banyak waktu yang saya habiskan untuk itu.
sumber
Jika Anda ingin menyuntikkan kode html gunakan direktif
Jika Anda ingin memuat seluruh komponen di suatu tempat, gunakan DynamicComponentLoader:
https://angular.io/docs/ts/latest/api/core/DynamicComponentLoader-class.html
sumber