Wyliczenie Typescript wydaje się być naturalnym dopasowaniem do dyrektywy ngSwitch w Angular2. Ale kiedy próbuję użyć wyliczenia w szablonie mojego składnika, otrzymuję komunikat „Nie można odczytać właściwości 'xxx' o wartości undefined w ...”. Jak mogę używać wartości wyliczenia w szablonie składników?
Zwróć uwagę, że różni się to od sposobu tworzenia opcji wyboru html na podstawie WSZYSTKICH wartości wyliczenia (ngFor). To pytanie dotyczy ngSwitch opartego na określonej wartości wyliczenia. Chociaż pojawia się to samo podejście do tworzenia wewnętrznego odwołania klasy do wyliczenia.
typescript
angular
Carl G
źródło
źródło
Odpowiedzi:
Możesz utworzyć odwołanie do wyliczenia w swojej klasie komponentu (właśnie zmieniłem początkowy znak na małą literę), a następnie użyć tego odniesienia z szablonu ( plunker ):
źródło
Możesz utworzyć dekorator niestandardowy, który zostanie dodany do komponentu, aby był świadomy wyliczeń.
myenum.enum.ts:
myenumaware.decorator.ts
enum-aware.component.ts
źródło
MyEnumAware()
któregoEnumAwareComponent
jest przekazywana instancja, i ma właściwośćMyEnum
, dodaną do jej prototypu. Wartość właściwości to samo wyliczenie. Ta metoda działa tak samo, jak zaakceptowana odpowiedź. Po prostu wykorzystuje cukier składniowy proponowany dla dekoratorów i dozwolony w TypeScript. Używając Angulara, od razu używasz składni dekoratora. Tym właśnieComponent
jest a , rozszerzeniem pustej klasy, z którą podstawowe klasy Angulara wiedzą, jak współdziałać.ERROR in ng:///.../whatever.component.html (13,3): Property 'MyEnum' does not exist on type 'EnumAwareComponent'
. Ma to sens, ponieważ właściwość dodawana przez dekoratora nigdy nie jest deklarowana, co powoduje, że kompilator maszynopisu nie jest świadomy jej istnienia.--prod
kompilację (Ionic 3 / Angular 4 / Typescript 2.4.2), już nie działa. Otrzymuję błąd"TypeError: Cannot read property 'FirstValue' of undefined"
. Używam standardowego wyliczenia liczbowego. Działa dobrze z AoT, ale nie z--prod
. Działa, jeśli zmienię to na używanie liczb całkowitych w HTML, ale nie o to chodzi. Jakieś pomysły?To proste i działa jak urok :) po prostu zadeklaruj swoje wyliczenie w ten sposób i możesz użyć go w szablonie HTML
źródło
StatusEnum
jest zdefiniowany w jednej z.ts
klas. W komponencie Angular, który importujesz, powiąż go z właściwością komponentu (tutajstatusEnum
), a właściwości komponentu są dostępne z szablonu.Angular4 - Używanie Enum w szablonie HTML ngSwitch / ngSwitchCase
Rozwiązanie tutaj: https://stackoverflow.com/a/42464835/802196
kredyt: @snorkpete
W swoim komponencie masz
Następnie w swoim komponencie wprowadzasz typ wyliczenia za pośrednictwem elementu członkowskiego „MyEnum” i tworzysz kolejny element członkowski dla zmiennej wyliczeniowej „myEnumVar”:
Możesz teraz używać myEnumVar i MyEnum w swoim szablonie .html. Np. Używanie wyliczeń w ngSwitch:
źródło
od rc.6 / final
...
źródło
Jako alternatywę dla dekoratora @Eric Lease, który niestety nie działa przy użyciu
--aot
(a tym samym--prod
) kompilacji, skorzystałem z usługi, która udostępnia wszystkie wyliczenia mojej aplikacji. Wystarczy publicznie wstrzyknąć to do każdego składnika, który tego wymaga, pod łatwą nazwą, po czym uzyskasz dostęp do wyliczeń w swoich widokach. Na przykład:Usługa
Nie zapomnij umieścić go na liście dostawców modułu.
Klasa komponentu
Komponent html
źródło
Zacznij od rozważenia „Czy naprawdę chcę to zrobić?”
Nie mam problemu z odwołaniem się do wyliczeń bezpośrednio w HTML, ale w niektórych przypadkach istnieją czystsze alternatywy, które nie tracą bezpieczeństwa typów. Na przykład, jeśli wybierzesz podejście pokazane w mojej drugiej odpowiedzi, być może zadeklarowałeś TT w swoim komponencie mniej więcej tak:
Aby pokazać inny układ w kodzie HTML, musisz mieć
*ngIf
dla każdego typu układu i możesz odwołać się bezpośrednio do wyliczenia w kodzie HTML swojego komponentu:W tym przykładzie użyto usługi, aby uzyskać bieżący układ, przepuszcza go przez potok asynchroniczny, a następnie porównuje go z naszą wartością wyliczenia. Jest dość rozwlekły, zawiły i niezbyt przyjemny do oglądania. Ujawnia również nazwę wyliczenia, która sama w sobie może być zbyt szczegółowa.
Alternatywa, która zachowuje bezpieczeństwo typów z kodu HTML
Alternatywnie możesz wykonać następujące czynności i zadeklarować bardziej czytelną funkcję w pliku .ts swojego komponentu:
Dużo czystsze! Ale co, jeśli ktoś
'Horziontal'
przez pomyłkę wpisze ? Powodem, dla którego chciałeś użyć wyliczenia w kodzie HTML, była ochrona przed typami, prawda?Nadal możemy to osiągnąć dzięki keyof i pewnej magii maszynopisu. Oto definicja funkcji:
Uwaga Wykorzystanie
FeatureBoxResponsiveLayout[string]
który konwertuje wartość ciągu przekazywana do wartości liczbowej wyliczenia.Spowoduje to wyświetlenie komunikatu o błędzie z kompilacją AOT, jeśli użyjesz nieprawidłowej wartości.
Obecnie VSCode nie jest wystarczająco inteligentny, aby podkreślać
H4orizontal
w edytorze HTML, ale ostrzeżenie zostanie wyświetlone w czasie kompilacji (za pomocą opcji --prod build lub --aot). To również może zostać poprawione w przyszłej aktualizacji.źródło
html
ale widzę twój punkt widzenia i zacząłem go używać; spełnia swoje zadanie, jak za starych dobrych czasów, podczas kompilacji! :)Mój komponent używał obiektu
myClassObject
typuMyClass
, którego sam używałMyEnum
. Prowadzi to do tego samego problemu, który opisano powyżej. Rozwiązałem to, wykonując:a następnie używając tego w szablonie jako
źródło
Jeśli używasz podejścia `` odwołanie do typetowania '' (z @Carl G) i używasz wielu tabel typów, możesz rozważyć ten sposób:
Następnie uzyskaj dostęp do pliku html za pomocą
Preferuję takie podejście, ponieważ jasno pokazuje, że odnosisz się do maszynopisu, a także pozwala uniknąć niepotrzebnego zanieczyszczenia pliku składowego.
Możesz także umieścić
TT
gdzieś globalną i dodać do niej wyliczenia w razie potrzeby (jeśli chcesz, możesz równie dobrze wykonać usługę, jak pokazuje odpowiedź @VincentSels). Jeśli masz wiele różnych maszynopisów, może to stać się uciążliwe.Ponadto zawsze zmieniasz ich nazwy w deklaracji, aby uzyskać krótszą nazwę.
źródło