Comment utiliser un tapuscrit valeur d'enum dans un Angular2 ngSwitch déclaration
Le Tapuscrit enum semble naturel match avec Angular2 de ngSwitch directive. Mais quand j'essaie d'utiliser un enum dans mon composante du modèle, j'ai "Impossible de lire la propriété 'xxx' undefined dans ...". Comment puis-je utiliser les valeurs de l'enum dans mon modèle de composant?
Veuillez noter que ceci est différent de la façon de créer le html, sélectionnez options en fonction de l'ENSEMBLE des valeurs d'un enum (ngFor). Cette question est à propos ngSwitch basée sur une valeur particulière d'un enum. Bien que la même approche de la création d'une classe de référence interne à l'enum apparaît.
- Double Possible de Sélectionnez en fonction de la enum dans Angular2
- Je ne pense pas que ces questions sont des doublons; l'autre est de savoir comment créer le HTML, sélectionnez options en fonction de l'ENSEMBLE des valeurs d'un enum (ngFor), alors que celui-ci est ngSwitch basée sur une valeur particulière d'un enum. Bien que la même approche de la création d'une classe de référence interne à l'enum s'affiche. Merci pour souligner la similitude.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer une référence à l'enum dans votre classe de composant (j'ai juste changé le caractère initial pour être en minuscules) puis utilisez-référence du modèle (plunker):
Vous pouvez créer un décorateur pour ajouter à votre composant afin de le rendre conscient des enums.
myenum.enum.ts:
myenumaware.décorateur.ts
enum-conscient.composante.ts
ng build --prod --aot
à l'aide angulaire/cli 1.0.0 Angulaire 4.0.1 fonctionne très bien pour moi.exports **default** class
,ng build
peut pas compiler en disant qu'il ne sait pas ce que l'enum est, lorsque j'ajoutedefault
, puis il me dit que mon composant n'existe pas... triste haricots...MyEnumAware()
, où laEnumAwareComponent
instance est passé, et a une propriété,MyEnum
, ajouté à son prototype. La valeur de la propriété est définie à l'enum lui-même. Cette méthode fait la même chose que l'on a accepté la réponse. C'est juste profitant du sucre syntaxique proposée pour les décorateurs et les permis en caractères d'imprimerie. Lors de l'utilisation Angulaire vous êtes à l'aide de la décoratrice syntaxe droit au large de la chauve-souris. Qu'est ce qu'uneComponent
est, une extension d'une classe vide qui Angulaire du cours de base, savoir comment interagir avec.ERROR in ng:///.../whatever.component.html (13,3): Property 'MyEnum' does not exist on type 'EnumAwareComponent'
. Cela fait sens, parce que le bien le décorateur ajoute n'est jamais déclaré, laissant le tapuscrit compilateur pas au courant de son existence.MyEnum: any
à la définition de la classe.--prod
construire des ions (3 / Angulaire 4 / Tapuscrit 2.4.2) il ne fonctionne plus. Je reçois le message d'erreur"TypeError: Cannot read property 'FirstValue' of undefined"
. Je suis en utilisant un standard numérique enum. Il fonctionne très bien avec AoT mais pas avec--prod
. Il fonctionne si je le changer à l'aide de nombres entiers dans le code HTML, mais ce n'est pas le point. Des idées?Property 'EnumNameHere' does not exist on type 'ComponentNameHere'
--aot
drapeau, vous pouvez utiliser un service au lieu de voir la réponse de stackoverflow.com/a/51307059/1364650Angular4 - Utilisation d'Enum dans le Modèle HTML ngSwitch /ngSwitchCase
Solution ici: https://stackoverflow.com/a/42464835/802196
de crédit: @snorkpete
Dans votre composant, vous avez
Ensuite dans votre composant, vous apportez dans le type Enum par l'intermédiaire d'un membre "MyEnum', et de créer un autre membre de votre enum variable 'myEnumVar' :
Vous pouvez maintenant utiliser myEnumVar et MyEnum dans votre .modèle html. Par exemple, en Utilisant les Enums ngSwitch:
C'est simple et fonctionne comme un charme 🙂
il suffit de déclarer votre enum comme cela et vous pouvez l'utiliser sur le modèle HTML
const enum
?de rc.6 /final
...
Comme une alternative à @Eric Location de décorateur, qui, malheureusement, ne fonctionne pas à l'aide de
--aot
(et donc--prod
) s'appuie, j'ai eu recours à l'aide d'un service qui expose toutes mes application des enums. Juste besoin d'publiquement injecter dans chaque composante, ce qui l'oblige, sous un nom facile, après quoi vous pouvez accéder à l'option de votre point de vue. E. g.:Service
N'oubliez pas de l'inclure dans votre module de liste fournisseur.
Classe de composant
Composant html
Commencer par considérer son " Dois-je vraiment voulez faire cela?'
Je n'ai pas de problème en se référant à des enums directement dans le HTML, mais dans certains cas, il existe des options plus écologiques qui ne perdent pas de type-safe-ness.
Par exemple, si vous choisissez l'approche présentée dans mon autre réponse, vous pouvez avoir déclaré TT dans votre composant quelque chose comme ceci:
De montrer une mise en page différente dans votre code HTML, vous auriez un
*ngIf
pour chaque type de mise en page, et vous pourriez vous référer directement à la enum dans votre composant HTML:Cet exemple utilise un service de la mise en page actuelle, l'exécute par le biais de la async pipe et puis la compare à notre valeur d'enum. C'est assez verbeux, compliqué et pas beaucoup de plaisir à regarder. Il expose également le nom de l'enum, qui lui-même peut-être trop verbeux.
Alternative, qui conserve le type de sécurité de l'HTML
Alternativement, vous pouvez effectuer les opérations suivantes, et déclarer un plus lisible en fonction de votre composant .ts fichier :
Beaucoup plus propre! Mais que faire si quelqu'un tape dans
'Horziontal'
par erreur? La raison pour laquelle vous voulez utiliser un enum dans le code HTML de a à typesafe droit?Nous pouvons encore obtenir qu'avec keyof et certains tapuscrit de la magie. C'est la définition de la fonction:
Remarque l'utilisation de
FeatureBoxResponsiveLayout[string]
qui convertit la chaîne de valeur transmise à la valeur numérique de l'enum.Cela donnera un message d'erreur avec un AOT compilation si vous utilisez une valeur non valide.
Actuellement VSCode n'est pas assez intelligent pour souligner
H4orizontal
dans l'éditeur HTML, mais vous obtiendrez de l'avertissement au moment de la compilation (avec --prod construire ou --aot switch). Cela peut également être amélioré dans une future mise à jour.html
mais je vois votre point de vue et a commencé à l'utiliser; il fait le travail, comme au bon vieux temps, lors de la compilation! 🙂Si l'utilisation de la " typetable de référence de l'approche (de @Carl G) et vous êtes à l'aide de plusieurs tables de type, vous pourriez envisager de cette façon :
Alors accès à votre fichier html avec
Je préfère cette approche, il est clair que vous faites allusion à une typetable, et aussi évite la pollution de votre fichier de composant.
Vous pouvez aussi mettre un mondial
TT
quelque part et ajouter les énumérations ce qu'il fallait (si vous voulez vous pouvez ainsi faire un service comme indiqué par @VincentSels réponse). Si vous avez de nombreux de nombreux typetables cela peut devenir lourd.Également vous toujours de les renommer dans votre déclaration pour obtenir un nom plus court.
Mon composant utilisé un objet
myClassObject
de typeMyClass
, qui était lui-même à l'aide deMyEnum
. Cela a conduit à le même problème décrit ci-dessus. Résolu en faisant:et d'utiliser ensuite ce dans le modèle comme