Можно ли аннотировать модели данных метаданными в angular? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть простая модель данных, которую я хочу аннотировать с помощью метаданных

export class Certification {
    title: string;
    certificationType?: CertificationType;
    validTo?: number;
    description?: string;
    externalIdentifier: Guid;

    constructor() {
        this.title = '';
        this.certificationType = CertificationType.Undefined;
        this.validTo = 0;
        this.description = '';
        this.externalIdentifier = null;
    }
}

Я надеялся, что смогу как-то аннотировать модель следующим образом:

export class Certification {
    @Heading() 
    title: string;
    certificationType?: CertificationType;
    @Label('My label') 
    validTo?: number;
    description?: string;
    @Hidden()
    externalIdentifier: Guid;

    constructor() {...}
}

У меня много из этих очень похожих моделей, поэтому я бы предпочел создать простой компонент для обработки логики отображения c для всех из них, а не один компонент для каждой модели, и тогда разница будет контролироваться каждым отдельным шаблоном.

Я попытался использовать api отраженных метаданных, как определено в документации по машинописи, как описано здесь: https://www.typescriptlang.org/docs/handbook/decorators.html#property -декораторы Но даже если метаданные применяются к модели во время построения, они, похоже, потеряны когда я назначил его через привязку.

<display-annotated-model [model]="certification"></display-annotated-model>

Итак, мой вопрос: у кого-нибудь это работает?

Или есть другой способ аннотировать модели данных, на которые мне следует взглянуть (я исчерпал свои возможности поиска в Google)?

Мне нужно, чтобы это работало в Angular 9. Любой ввод ценится:)

1 Ответ

0 голосов
/ 29 апреля 2020

Это возможно. Первоначальный план аннотаций сделал бы это очень полезным. К сожалению, эти аннотации стали декораторами. В качестве декораторов любые метаданные о свойстве, которое они украшают, хранятся в глобальном хранилище декораторов.

Angular сам преобразует свои встроенные декораторы (@Component (), @Directive (), @Pipe (), NgModel (), @Injectable (), et c ...) при компиляции время назад в аннотации.

В чем разница между аннотациями и декораторами?

Аннотации - это просто метаданные, которые хранятся в экземпляре объекта (в зависимости от того, что вы аннотируете).

Декораторы - это оболочки, которые могут изменять метод доступа, метод, класс свойства, а также предоставлять метаданные для каждого метода доступа, метода или класса.

Из-за этой динамической c природы декораторов компиляторы не могут определить, может ли базовый код безопасно встряхнуться в дереве.

По этой причине декораторы в большинстве случаев не подходят для кода браузера. Хотя пользовательские плагины компилятора могут быть созданы для пользовательских декораторов - что, по сути, будет делать то же, что и Angular для своих декораторов.

Альтернативный подход, который меня заинтересовал бы, заключается в возможности добавления метаданных в декларацию ReactiveForm.

Вот пример чего-то похожего: https://github.com/martinmcwhorter/modelmetadata

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...