Die Typescript-Aufzählung scheint eine natürliche Übereinstimmung mit der ngSwitch-Direktive von Angular2 zu sein. Wenn ich jedoch versuche, eine Aufzählung in der Vorlage meiner Komponente zu verwenden, wird "Eigenschaft 'xxx' von undefiniert in ... kann nicht gelesen werden" angezeigt. Wie kann ich Enum-Werte in meiner Komponentenvorlage verwenden?
Bitte beachten Sie, dass dies anders ist als das Erstellen von HTML-Auswahloptionen basierend auf ALLEN Werten einer Aufzählung (ngFor). Diese Frage bezieht sich auf ngSwitch basierend auf einem bestimmten Wert einer Aufzählung. Obwohl der gleiche Ansatz zum Erstellen eines klasseninternen Verweises auf die Aufzählung erscheint.
typescript
angular
Carl G.
quelle
quelle
Antworten:
Sie können einen Verweis auf die Aufzählung in Ihrer Komponentenklasse erstellen (ich habe gerade das ursprüngliche Zeichen in Kleinbuchstaben geändert) und dann diesen Verweis aus der Vorlage ( Plunker ) verwenden:
quelle
Sie können einen benutzerdefinierten Dekorator erstellen, der Ihrer Komponente hinzugefügt wird, um sie auf Aufzählungen aufmerksam zu machen.
myenum.enum.ts:
myenumaware.decorator.ts
enum -aware.component.ts
quelle
MyEnumAware()
, an den dieEnumAwareComponent
Instanz übergeben wird, und verfügt über eine Eigenschaft,MyEnum
die dem Prototyp hinzugefügt wurde. Der Wert der Eigenschaft wird in der Aufzählung selbst festgelegt. Diese Methode macht dasselbe wie die akzeptierte Antwort. Es nutzt nur den syntaktischen Zucker, der für Dekorateure vorgeschlagen und in TypeScript erlaubt ist. Wenn Sie Angular verwenden, verwenden Sie sofort die Decorator-Syntax. DasComponent
ist a , eine Erweiterung einer leeren Klasse, mit der Angulars Kernklassen interagieren können.ERROR in ng:///.../whatever.component.html (13,3): Property 'MyEnum' does not exist on type 'EnumAwareComponent'
. Dies ist sinnvoll, da die vom Dekorateur hinzugefügte Eigenschaft niemals deklariert wird und der Typoskript-Compiler nichts von ihrer Existenz weiß.--prod
Build mache (Ionic 3 / Angular 4 / Typescript 2.4.2), funktioniert es jedoch nicht mehr. Ich bekomme den Fehler"TypeError: Cannot read property 'FirstValue' of undefined"
. Ich verwende eine numerische Standardaufzählung. Es funktioniert gut mit AoT, aber nicht mit--prod
. Es funktioniert, wenn ich es in die Verwendung von Ganzzahlen im HTML ändere, aber das ist nicht der Punkt. Irgendwelche Ideen?Dies ist einfach und funktioniert wie ein Zauber :) Deklarieren Sie einfach Ihre Aufzählung wie folgt und Sie können sie für HTML-Vorlagen verwenden
quelle
StatusEnum
ist in einer der.ts
Klassen definiert. Binden Sie die Angular-Komponente, die Sie importieren, an eine Komponenteneigenschaft (hierstatusEnum
), und auf die Komponenteneigenschaften kann über die Vorlage zugegriffen werden.Angular4 - Verwenden von Enum in der HTML-Vorlage ngSwitch / ngSwitchCase
Lösung hier: https://stackoverflow.com/a/42464835/802196
Bildnachweis: @snorkpete
In Ihrer Komponente haben Sie
Anschließend bringen Sie in Ihrer Komponente den Aufzählungstyp über ein Mitglied 'MyEnum' ein und erstellen ein weiteres Mitglied für Ihre Aufzählungsvariable 'myEnumVar':
Sie können jetzt myEnumVar und MyEnum in Ihrer HTML-Vorlage verwenden. Beispiel: Verwenden von Enums in ngSwitch:
quelle
ab rc.6 / final
...
quelle
Als Alternative zu @Eric Leases Dekorateur, der leider nicht mit
--aot
(und damit--prod
) Builds funktioniert , habe ich auf einen Dienst zurückgegriffen, der alle Aufzählungen meiner Anwendung verfügbar macht. Sie müssen dies nur öffentlich in jede Komponente einfügen, für die dies erforderlich ist, und zwar unter einem einfachen Namen. Danach können Sie auf die Aufzählungen in Ihren Ansichten zugreifen. Z.B:Bedienung
Vergessen Sie nicht, es in die Anbieterliste Ihres Moduls aufzunehmen.
Komponentenklasse
Komponente HTML
quelle
Beginnen Sie mit der Überlegung, ob ich das wirklich tun möchte.
Ich habe kein Problem damit, auf Enums direkt in HTML zu verweisen, aber in einigen Fällen gibt es sauberere Alternativen, die die Typensicherheit nicht verlieren. Wenn Sie beispielsweise den in meiner anderen Antwort gezeigten Ansatz wählen, haben Sie möglicherweise TT in Ihrer Komponente wie folgt deklariert:
Um ein anderes Layout in Ihrem HTML-Code anzuzeigen, haben Sie
*ngIf
für jeden Layouttyp ein Layout, und Sie können direkt auf die Aufzählung im HTML-Code Ihrer Komponente verweisen:In diesem Beispiel wird ein Dienst verwendet, um das aktuelle Layout abzurufen, es durch die asynchrone Pipe auszuführen und es dann mit unserem Aufzählungswert zu vergleichen. Es ist ziemlich ausführlich, verschlungen und macht nicht viel Spaß, es anzuschauen. Es enthüllt auch den Namen der Aufzählung, die selbst zu ausführlich sein kann.
Alternativ bleibt die Typensicherheit des HTML-Codes erhalten
Alternativ können Sie Folgendes tun und eine besser lesbare Funktion in der .ts-Datei Ihrer Komponente deklarieren:
Viel sauberer! Aber was ist, wenn jemand versehentlich
'Horziontal'
tippt? Der ganze Grund, warum Sie eine Aufzählung im HTML verwenden wollten, war typsicher zu sein, oder?Wir können das immer noch mit keyof und etwas Typoskript-Magie erreichen. Dies ist die Definition der Funktion:
Beachten Sie, bei
FeatureBoxResponsiveLayout[string]
welcher Verwendung der übergebene Zeichenfolgenwert in den numerischen Wert der Aufzählung konvertiert wird .Dies gibt eine Fehlermeldung mit einer AOT-Kompilierung aus, wenn Sie einen ungültigen Wert verwenden.
Derzeit ist VSCode nicht intelligent genug, um
H4orizontal
im HTML-Editor zu unterstreichen , aber Sie erhalten die Warnung beim Kompilieren (mit --prod build oder --aot switch). Dies kann auch in einem zukünftigen Update verbessert werden.quelle
html
aber ich sehe Ihren Standpunkt und habe angefangen, ihn zu verwenden. es macht den Job, wie die guten alten Zeiten, beim Kompilieren! :)Meine Komponente verwendete ein Objekt
myClassObject
vom TypMyClass
, das selbst verwendet wurdeMyEnum
. Dies führte zu dem oben beschriebenen Problem. Es wurde gelöst durch:und dann in der Vorlage als verwenden
quelle
Wenn Sie den Ansatz "Typetable Reference" (von @Carl G) verwenden und mehrere Typentabellen verwenden, sollten Sie Folgendes berücksichtigen:
Dann greifen Sie in Ihrer HTML-Datei mit zu
Ich bevorzuge diesen Ansatz, da er deutlich macht, dass Sie sich auf eine Typetabelle beziehen, und außerdem eine unnötige Verschmutzung Ihrer Komponentendatei vermeidet.
Sie können auch
TT
irgendwo eine globale Datei einfügen und nach Bedarf Aufzählungen hinzufügen (wenn Sie dies möchten, können Sie auch einen Dienst erstellen, wie in der Antwort von @VincentSels gezeigt). Wenn Sie viele, viele Typetabellen haben, kann dies umständlich werden.Außerdem benennen Sie sie in Ihrer Deklaration immer um, um einen kürzeren Namen zu erhalten.
quelle