A enumeração Typescript parece uma correspondência natural com a diretiva ngSwitch do Angular2. Mas quando tento usar uma enumeração no modelo do meu componente, recebo "Não é possível ler a propriedade 'xxx' de indefinida em ...". Como posso usar valores de enumeração no meu modelo de componente?
Observe que isso é diferente de como criar opções de seleção html com base em TODOS os valores de uma enumeração (ngFor). Esta pergunta é sobre ngSwitch com base em um valor particular de um enum. Embora a mesma abordagem de criação de uma referência interna da classe ao enum seja exibida.
typescript
angular
Carl G
fonte
fonte
Respostas:
Você pode criar uma referência ao enum na sua classe de componente (acabei de alterar o caractere inicial para minúsculo) e, em seguida, usar essa referência no modelo ( plunker ):
fonte
Você pode criar um decorador personalizado para adicionar ao seu componente e torná-lo ciente das enumerações.
myenum.enum.ts:
myenumaware.decorator.ts
enum-awareness.component.ts
fonte
MyEnumAware()
, onde aEnumAwareComponent
instância é passada e tem uma propriedadeMyEnum
, adicionada ao seu protótipo. O valor da propriedade é definido na própria enumeração. Este método faz a mesma coisa que a resposta aceita. É apenas tirar proveito do açúcar sintático proposto para decoradores e permitido no TypeScript. Ao usar Angular, você está usando a sintaxe do decorador logo de cara. Isso é o queComponent
é , uma extensão de uma classe vazia com a qual as classes principais do Angular sabem como interagir.ERROR in ng:///.../whatever.component.html (13,3): Property 'MyEnum' does not exist on type 'EnumAwareComponent'
. Isso faz sentido, porque a propriedade que o decorador adiciona nunca é declarada, deixando o compilador datilografado inconsciente de sua existência.--prod
compilação (Ionic 3 / Angular 4 / Typescript 2.4.2), não funciona mais. Eu recebo o erro"TypeError: Cannot read property 'FirstValue' of undefined"
. Estou usando uma enumeração numérica padrão. Funciona bem com o AoT, mas não com--prod
. Funciona se eu mudar para o uso de números inteiros no HTML, mas esse não é o ponto. Alguma ideia?Isso é simples e funciona como um encanto :) basta declarar seu enum assim e você pode usá-lo no modelo HTML
fonte
StatusEnum
é definido em uma das.ts
classes. No componente Angular importado, vincule-o a uma propriedade do componente (aquistatusEnum
) e as propriedades do componente podem ser acessadas no modelo.Angular4 - Usando Enum no modelo HTML ngSwitch / ngSwitchCase
Solução aqui: https://stackoverflow.com/a/42464835/802196
crédito: @snorkpete
No seu componente, você tem
Em seguida, em seu componente, você traz o tipo de Enum por meio de um membro 'MyEnum' e cria outro membro para sua variável de enum 'myEnumVar':
Agora você pode usar myEnumVar e MyEnum no seu modelo .html. Por exemplo, usando enums no ngSwitch:
fonte
a partir de rc.6 / final
...
fonte
Como alternativa ao decorador do @Eric Lease, que infelizmente não funciona usando
--aot
(e, portanto--prod
, compila), recorri ao uso de um serviço que expõe todas as enumerações do meu aplicativo. Só é necessário injetar publicamente isso em cada componente que exige, com um nome fácil, após o qual você pode acessar as enumerações em suas visualizações. Por exemplo:Serviço
Não se esqueça de incluí-lo na lista de provedores do seu módulo.
Classe de componente
Html componente
fonte
Comece considerando 'Eu realmente quero fazer isso?'
Não tenho problema em me referir a enumerações diretamente em HTML, mas em alguns casos existem alternativas mais limpas que não perdem a segurança de tipo. Por exemplo, se você escolher a abordagem mostrada na minha outra resposta, poderá ter declarado TT no seu componente algo como isto:
Para mostrar um layout diferente no seu HTML, você deve ter um
*ngIf
para cada tipo de layout e pode se referir diretamente à enumeração no HTML do seu componente:Este exemplo usa um serviço para obter o layout atual, executa-o através do canal assíncrono e depois o compara ao nosso valor de enumeração. É bem detalhado, complicado e pouco divertido de se ver. Também expõe o nome da enum, que por si só pode ser excessivamente detalhado.
Alternativa, que mantém a segurança de tipo do HTML
Como alternativa, você pode fazer o seguinte e declarar uma função mais legível no arquivo .ts do seu componente:
Muito mais limpo! Mas e se alguém digitar
'Horziontal'
por engano? Todo o motivo pelo qual você queria usar uma enumeração no HTML era ser tipicamente seguro, certo?Ainda podemos conseguir isso com keyof e alguma mágica datilografada. Esta é a definição da função:
Observe o uso do
FeatureBoxResponsiveLayout[string]
qual converte o valor da seqüência de caracteres passado para o valor numérico da enumeração.Isso fornecerá uma mensagem de erro com uma compilação AOT se você usar um valor inválido.
Atualmente, o VSCode não é inteligente o suficiente para sublinhar
H4orizontal
no editor de HTML, mas você receberá o aviso em tempo de compilação (com --prod build ou --aot switch). Isso também pode ser aprimorado em uma atualização futura.fonte
html
mas entendi o seu ponto e comecei a usá-lo; faz o trabalho, como nos bons velhos tempos, ao compilar! :)Meu componente usou um objeto
myClassObject
do tipoMyClass
que ele próprio estava usandoMyEnum
. Isso levou ao mesmo problema descrito acima. Resolvido fazendo:e, em seguida, usando isso no modelo como
fonte
Se você estiver usando a abordagem 'typetable reference' (de @Carl G) e estiver usando várias tabelas de tipos, poderá considerar o seguinte:
Em seguida, acesse seu arquivo html com
Eu sou a favor dessa abordagem, pois deixa claro que você está se referindo a uma tabela tipográfica e também evita a poluição desnecessária do seu arquivo componente.
Você também pode colocar um global em
TT
algum lugar e adicionar enumerações a ele conforme necessário (se você quiser isso, também poderá fazer um serviço, conforme mostrado pela resposta @VincentSels). Se você tiver muitas tabelas tipográficas, isso pode se tornar complicado.Além disso, você sempre os renomeia na sua declaração para obter um nome mais curto.
fonte