Расширение / украшение компонентов и директив Angular 2

У меня есть несколько вариантов использования наследования и украшения (как в шаблоне Decorator) компонентов и директив в Angular 2.

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

В основном это

export const BASE_SOME_COMPONENT_METADATA = { ... };

@Component(BASE_SOME_COMPONENT_METADATA);
export class BaseSomeComponent { ... }

...

import { BaseSomeComponent, BASE_SOME_COMPONENT_METADATA } from '...';

@Component(Object.assign({}, BASE_SOME_COMPONENT_METADATA, { template: '...' });
export class SomeComponent extends BaseSomeComponent {}

И более сложный случай

@Component({ ... });
export class ThirdPartyComponent {
  @Input() ...;
  @Input() ...;
  @Input() ...;
  ...
}

...

import { ThirdPartyComponent as BaseThirdPartyComponent } from '...';

@Component({
  // may modify or replace any of the original properties
  template: ...,
  styles: ...
  ...
});
export class ThirdPartyComponent extends BaseThirdPartyComponent {}

Обратите внимание, что ThirdPartyComponent имеет множество входов. Могут быть случаи, когда полезно модифицировать компонент изнутри, а не оборачивать его и изменять его поведение извне. Компонент оболочки, который перечисляет их все в шаблоне и передает их ThirdPartyComponent, может быть ВЛАЖНЫМ и грязным:

<third-party inputs="inputs" that="that" should="should" be="be" enumerated="enumerated">

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

ThirdPartyComponent может быть основным компонентом (кнопкой), который используется другими сторонними компонентами. Затем они также должны быть затронуты, поэтому может потребоваться «украсить декоратор» по всему инжектору, а не просто расширить его.

В Angular 1.x thirdPartyDirective - это служба, которая предоставляет полный доступ к компонентам DDO, чтобы их можно было оформить, расширить, поджарить и т. Д. Каковы прямые аналоги этого подхода в Angular 2? Если это нарушает некоторые правила и аннулирует гарантию, ничего страшного.

Как можно расширить компонент / директиву, не экспортирующую свои метаданные?

Как можно изменить метаданные существующего компонента?


person Estus Flask    schedule 28.06.2016    source источник


Ответы (1)


Ваши входные данные будут автоматически унаследованы от родительского класса. Что касается свойств самого декоратора Component, в Angular2 нет собственного способа сделать это. Команда Angular2 не будет поддерживать это: https://github.com/angular/angular/issues/7968#issuecomment-219865739.

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

Эта статья может вас заинтересовать:

person Thierry Templier    schedule 28.06.2016
comment
Проблема с входными данными относится к компоненту оболочки, который принудительно выполняет do<originalComponent all="all" the="the" inputs="inputs" that="that" should="should" be="be" enumerated="enumerated"> в шаблоне. У меня есть своя доля таких в Ng, но в итоге я добавил attrs программно в compile. Я пытаюсь найти рецепты, как эффективно делать такие вещи на Ng2. - person Estus Flask; 28.06.2016
comment
Кстати, отличное чтение, спасибо за ссылки. На самом деле, я обнаружил, что этот ответ от вас по большей части отвечает на ваш вопрос. - person Estus Flask; 01.07.2016