Encript Script tampaknya cocok alami dengan arahan ngSwitch Angular2. Tetapi ketika saya mencoba menggunakan enum dalam templat komponen saya, saya mendapatkan "Tidak dapat membaca properti 'xxx' dari yang tidak terdefinisi di ...". Bagaimana saya bisa menggunakan nilai enum dalam templat komponen saya?
Harap dicatat bahwa ini berbeda dari cara membuat opsi pilih html berdasarkan SEMUA nilai enum (ngFor). Pertanyaan ini adalah tentang ngSwitch berdasarkan nilai enum tertentu. Meskipun pendekatan yang sama untuk membuat referensi kelas-internal ke enum muncul.
typescript
angular
Carl G
sumber
sumber
Jawaban:
Anda dapat membuat referensi ke enum di kelas komponen Anda (saya baru saja mengubah karakter awal menjadi huruf kecil) dan kemudian menggunakan referensi itu dari templat ( plunker ):
sumber
Anda dapat membuat dekorator khusus untuk ditambahkan ke komponen Anda agar membuatnya sadar akan enum.
myenum.enum.ts:
myenumaware.decorator.ts
enum-aware.component.ts
sumber
MyEnumAware()
, di manaEnumAwareComponent
instance dilewatkan, dan memiliki propertiMyEnum
, ditambahkan ke prototipe. Nilai properti diatur enum itu sendiri. Metode ini melakukan hal yang sama dengan jawaban yang diterima. Ini hanya mengambil keuntungan dari gula sintaksis yang diusulkan untuk dekorator dan diizinkan dalam TypeScript. Saat menggunakan Angular, Anda menggunakan sintaksis dekorator langsung. Itulah apaComponent
itu , ekstensi dari kelas kosong yang kelas inti Angular tahu bagaimana berinteraksi.ERROR in ng:///.../whatever.component.html (13,3): Property 'MyEnum' does not exist on type 'EnumAwareComponent'
. Ini masuk akal, karena properti yang ditambahkan oleh dekorator tidak pernah dideklarasikan, membuat kompiler naskah tidak mengetahui keberadaannya.--prod
build (Ionic 3 / Angular 4 / Typescript 2.4.2) tidak lagi berfungsi. Saya mendapatkan kesalahan"TypeError: Cannot read property 'FirstValue' of undefined"
. Saya menggunakan enum numerik standar. Ini berfungsi baik dengan AoT tetapi tidak dengan--prod
. Itu berfungsi jika saya mengubahnya menggunakan integer dalam HTML, tapi bukan itu intinya. Ada ide?Ini sederhana dan berfungsi seperti pesona :) cukup nyatakan enum Anda seperti ini dan Anda dapat menggunakannya pada templat HTML
sumber
StatusEnum
didefinisikan di salah satu.ts
kelas. Di komponen Angular yang Anda impor, ikat ke properti komponen (di sinistatusEnum
) dan properti komponen dapat diakses dari templat.Angular4 - Menggunakan Enum di Template HTML ngSwitch / ngSwitchCase
Solusi di sini: https://stackoverflow.com/a/42464835/802196
kredit: @snorkpete
Di komponen Anda, Anda punya
Kemudian di komponen Anda, Anda membawa tipe Enum melalui anggota 'MyEnum', dan membuat anggota lain untuk variabel enum Anda 'myEnumVar':
Sekarang Anda dapat menggunakan myEnumVar dan MyEnum di templat .html Anda. Misalnya, Menggunakan Enums di ngSwitch:
sumber
per rc.6 / final
...
sumber
Sebagai alternatif dari dekorator @Eric Lease, yang sayangnya tidak berfungsi menggunakan
--aot
(dan dengan demikian--prod
) dibangun, saya menggunakan layanan yang memaparkan semua enums aplikasi saya. Hanya perlu menyuntikkan secara publik ke setiap komponen yang memerlukannya, dengan nama yang mudah, setelah itu Anda dapat mengakses enum dalam pandangan Anda. Misalnya:Layanan
Jangan lupa untuk memasukkannya ke dalam daftar penyedia modul Anda.
Kelas komponen
Komponen html
sumber
Mulailah dengan mempertimbangkan, 'Apakah saya benar - benar ingin melakukan ini?'
Saya tidak punya masalah merujuk langsung ke enums dalam HTML, tetapi dalam beberapa kasus ada alternatif yang lebih bersih yang tidak kehilangan jenis keamanan. Misalnya jika Anda memilih pendekatan yang ditunjukkan dalam jawaban saya yang lain, Anda mungkin telah menyatakan TT dalam komponen Anda, seperti ini:
Untuk menampilkan tata letak yang berbeda di HTML Anda, Anda akan memiliki
*ngIf
untuk setiap jenis tata letak, dan Anda bisa merujuk langsung ke enum di HTML komponen Anda:Contoh ini menggunakan layanan untuk mendapatkan tata letak saat ini, menjalankannya melalui pipa async dan kemudian membandingkannya dengan nilai enum kami. Sangat bertele-tele, berbelit-belit dan tidak menyenangkan untuk dilihat. Itu juga memperlihatkan nama enum, yang itu sendiri mungkin terlalu bertele-tele.
Alternatif, yang mempertahankan keamanan jenis dari HTML
Atau Anda dapat melakukan hal berikut, dan mendeklarasikan fungsi yang lebih mudah dibaca dalam file .ts komponen Anda:
Jauh lebih bersih! Tetapi bagaimana jika seseorang mengetik
'Horziontal'
secara tidak sengaja? Seluruh alasan Anda ingin menggunakan enum dalam HTML adalah untuk mengetik dengan benar, bukan?Kita masih bisa mencapainya dengan keyof dan beberapa sihir naskah. Ini adalah definisi fungsi:
Perhatikan penggunaan
FeatureBoxResponsiveLayout[string]
yang mengubah nilai string yang diteruskan ke nilai numerik enum.Ini akan memberikan pesan kesalahan dengan kompilasi AOT jika Anda menggunakan nilai yang tidak valid.
Saat ini VSCode tidak cukup pintar untuk menggarisbawahi
H4orizontal
dalam editor HTML, tetapi Anda akan mendapatkan peringatan pada waktu kompilasi (dengan --prod build atau --aot switch). Ini juga dapat ditingkatkan pada pembaruan di masa mendatang.sumber
html
tetapi saya melihat maksud Anda dan mulai menggunakannya; itu melakukan pekerjaan, seperti masa lalu yang indah, ketika menyusun! :)Komponen saya menggunakan objek
myClassObject
bertipeMyClass
, yang digunakan sendiriMyEnum
. Ini mengarah pada masalah yang sama seperti dijelaskan di atas. Selesaikan dengan melakukan:dan kemudian menggunakan ini di templat sebagai
sumber
Jika menggunakan pendekatan 'typetable reference' (dari @Carl G) dan Anda menggunakan beberapa tabel tipe, Anda mungkin ingin mempertimbangkan cara ini:
Kemudian akses dengan file html Anda dengan
Saya mendukung pendekatan ini karena menjelaskan Anda merujuk pada jenis yang dapat diubah, dan juga menghindari polusi yang tidak perlu pada file komponen Anda.
Anda juga dapat meletakkan global di
TT
suatu tempat dan menambahkan enum ke sana sesuai kebutuhan (jika Anda menginginkan ini, Anda juga dapat membuat layanan seperti yang ditunjukkan oleh jawaban @VincentSels). Jika Anda memiliki banyak jenis huruf ini mungkin menjadi rumit.Anda juga selalu mengganti nama mereka dalam deklarasi Anda untuk mendapatkan nama yang lebih pendek.
sumber