Перечисление Typescript кажется естественным совпадением с директивой Angular2 ngSwitch. Но когда я пытаюсь использовать перечисление в шаблоне моего компонента, я получаю «Не удается прочитать свойство« xxx »из undefined in ...». Как я могу использовать значения enum в шаблоне моего компонента?
Обратите внимание, что это отличается от того, как создавать опции выбора html на основе ВСЕХ значений перечисления (ngFor). Этот вопрос о ngSwitch, основанном на определенном значении перечисления. Хотя тот же самый подход создания внутренней ссылки на перечисление появляется.
typescript
angular
Карл Дж
источник
источник
Ответы:
Вы можете создать ссылку на перечисление в вашем классе компонентов (я только что изменил начальный символ на нижний регистр), а затем использовать эту ссылку из шаблона ( plunker ):
источник
Вы можете создать собственный декоратор для добавления в ваш компонент, чтобы он знал о перечислениях.
myenum.enum.ts:
myenumaware.decorator.ts
перечисляемые-aware.component.ts
источник
MyEnumAware()
, вEnumAwareComponent
который передается экземпляр, и имеет свойствоMyEnum
, добавленное к его прототипу. Значение свойства устанавливается самим перечислением. Этот метод делает то же самое, что и принятый ответ. Это просто использование синтаксического сахара, предложенного для декораторов и разрешенного в TypeScript. При использовании Angular вы сразу используете синтаксис декоратора. Вот чтоComponent
такое расширение пустого класса, с которым базовые классы Angular знают, как взаимодействовать.ERROR in ng:///.../whatever.component.html (13,3): Property 'MyEnum' does not exist on type 'EnumAwareComponent'
. Это имеет смысл, поскольку свойство, добавляемое декоратором, никогда не объявляется, поэтому компилятор машинописного текста не знает о его существовании.--prod
сборку (Ionic 3 / Angular 4 / Typescript 2.4.2), она больше не работает. Я получаю ошибку"TypeError: Cannot read property 'FirstValue' of undefined"
. Я использую стандартное числовое перечисление. Он отлично работает с AoT, но не с--prod
. Это работает, если я перехожу на использование целых чисел в HTML, но это не главное. Любые идеи?Это просто и работает как шарм :) просто объявите свой enum вот так, и вы можете использовать его в шаблоне HTML
источник
StatusEnum
определен в одном из.ts
классов. В компоненте Angular вы импортируете его, привязываете его к свойству компонента (здесьstatusEnum
), и свойства компонента доступны из шаблона.Angular4 - Использование Enum в шаблоне HTML ngSwitch / ngSwitchCase
Решение здесь: https://stackoverflow.com/a/42464835/802196
кредит: @snorkpete
В вашем компоненте у вас есть
Затем в вашем компоненте вы вводите тип Enum через член MyEnum и создаете другого члена для своей переменной enum myEnumVar:
Теперь вы можете использовать myEnumVar и MyEnum в своем .html шаблоне. Например, используя Enums в ngSwitch:
источник
по состоянию на 6 декабря / окончательный
...
источник
В качестве альтернативы декоратору @Eric Lease, который, к сожалению, не работает с использованием
--aot
(и, следовательно,--prod
сборками), я прибег к использованию службы, которая предоставляет все перечисления моего приложения. Просто нужно публично внедрить это в каждый компонент, который требует его, под простым именем, после чего вы можете получить доступ к перечислениям в ваших представлениях. Например:обслуживание
Не забудьте включить его в список поставщиков вашего модуля.
Класс компонента
Компонент HTML
источник
Начните с рассмотрения " Должен ли я на самом деле хочу , чтобы это сделать?
У меня нет проблем со ссылками на перечисления непосредственно в HTML, но в некоторых случаях есть более чистые альтернативы, которые не теряют безопасность типов. Например, если вы выберете подход, показанный в моем другом ответе, возможно, вы объявили TT в своем компоненте примерно так:
Чтобы показать другой макет в вашем HTML, вы должны иметь
*ngIf
для каждого типа макета и можете напрямую обратиться к перечислению в HTML вашего компонента:В этом примере используется служба для получения текущей компоновки, она запускается через асинхронный канал и затем сравнивается с нашим значением перечисления. Это довольно многословно, запутанно и не очень интересно смотреть. Это также выставляет имя enum, которое само по себе может быть слишком многословным.
Альтернатива, которая сохраняет безопасность типов из HTML
В качестве альтернативы вы можете сделать следующее и объявить более читаемую функцию в файле .ts вашего компонента:
Гораздо чище! Но что, если кто-то печатает
'Horziontal'
по ошибке? Вся причина, по которой вы хотели использовать enum в HTML, была в том, чтобы быть безопасным, не так ли?Мы все еще можем достичь этого с помощью keyof и некоторой магии машинописи. Это определение функции:
Обратите внимание на использование
FeatureBoxResponsiveLayout[string]
которого преобразует переданное строковое значение в числовое значение перечисления.Это даст сообщение об ошибке с компиляцией AOT, если вы используете недопустимое значение.
В настоящее время VSCode недостаточно умен, чтобы подчеркнуть его
H4orizontal
в редакторе HTML, но вы получите предупреждение во время компиляции (с ключом --prod build или --aot). Это также может быть улучшено в будущем обновлении.источник
html
но я понял вашу точку зрения и начал ее использовать; это делает работу, как старые добрые времена, при компиляции! :)Мой компонент использовал объект
myClassObject
типаMyClass
, который сам использовалMyEnum
. Это приводит к той же проблеме, описанной выше. Решил это, сделав:а затем использовать это в шаблоне как
источник
Если вы используете подход 'typetable reference' (из @Carl G) и вы используете несколько таблиц типов, вы можете рассмотреть этот способ:
Затем доступ в ваш HTML-файл с
Я предпочитаю этот подход, так как он дает понять, что вы имеете в виду набор текста, а также избегает ненужного загрязнения файла компонента.
Вы также можете поместить глобальный объект
TT
куда-нибудь и добавить к нему перечисления по мере необходимости (если вы хотите этого, вы также можете создать сервис, как показано в ответе @VincentSels). Если у вас много разных таблиц, это может стать громоздким.Также вы всегда переименовываете их в своем объявлении, чтобы получить более короткое имя.
источник