Extension / décoration des composants et directives Angular 2

J'ai des cas d'utilisation pour l'héritage et la décoration (comme dans le modèle Decorator) des composants et des directives dans Angular 2.

L'exemple est un composant avec un modèle de base qui ne convient pas au cas, au point où il est plus facile de définir un nouveau modèle au lieu de modifier les DOM d'un existant par programme. Le reste des métadonnées des composants doivent être héritées.

Fondamentalement, c'est

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 {} 

Et un cas plus compliqué est

 @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 {} 

Notez que ThirdPartyComponent possède de nombreuses entrées. Il peut y avoir des cas où il est avantageux de modifier un composant en interne au lieu de l'envelopper et de modifier son comportement de l'extérieur. Un composant wrapper qui les énumère tous dans le modèle et les transfère à ThirdPartyComponent peut être WET et sale:

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

Les éléments de mise en page supplémentaires introduits par les composants de l'emballage peuvent être interdits dans certains cas.

ThirdPartyComponent peut être un composant principal (un bouton) qui est utilisé par d'autres composants tiers. Ensuite, ils devraient également être affectés, il peut donc être nécessaire de «décorer le décorateur» sur l'injecteur, non seulement l'étendre.

Dans Angular 1.x thirdPartyDirective est un service qui offre un accès complet aux DDO composantes, afin qu'ils puissent être décorés, étendus, frits, etc. Quels sont les équivalents directs de cette approche dans Angular 2? Si cela cesse certaines règles et annule la garantie, c'est correct.

Comment un composant / directive qui n'exporte-t-il pas ses métadonnées peut-il être étendu?

Comment les métadonnées des composants existants peuvent-elles être modifiées?

Vos entrées seront héritées de la classe parent automatiquement. En ce qui concerne les propriétés du décorateur Component lui-même, il n'y a aucun mode natif de faire cela dans Angular2. L'équipe Angular2 ne fournira aucun support pour cela: https://github.com/angular/angular/issues/7968#issuecomment-219865739 .

Si vous voulez vraiment quelque chose comme ça, vous devez implémenter avec un décorateur personnalisé qui met à jour les annotations …

Cet article pourrait vous intéresser: