Étendre/remplacement d'un style de réutilisables angular2 composant
En supposant que nous voulons utiliser un composant à partir d'une bibliothèque dans angular2 (exemple de material2). Le composant d'annotation ressemble à ceci:
@Component({
moduleId: module.id,
selector: 'md-input',
templateUrl: 'input.html',
styleUrls: ['input.css'],
providers: [MD_INPUT_CONTROL_VALUE_ACCESSOR],
host: {'(click)' : 'focus()'}
})
Ce composant est livré avec un "défaut" de la feuille de style, l'entrée".css". Si nous utilisons cette composante dans notre application, nous avons susceptibles de vouloir remplacer/étendre certains du style, sans avoir à les copier et à manipuler le composant lui-même. Comment faire cela?
Solution Possible 1: Définir l'Encapsulation de "ViewEncapsulation.Aucun":
Ce n'est pas vraiment une solution, juste une solution de contournement.
Possible Solution 2: Utilisation de "::de l'ombre" ou "/deep/" dans le CSS:
Fonctionne aussi, mais sa obsolète selon WebComponent spec.
Possible Solution 3: Utiliser le CSS et remplacer le composant CSS:
Fonctionne aussi, mais il viole le shadow DOM concept.
Possible Solution 4: Remplacer directement dans le modèle de composant parent:
Exemple:
<my-cmp [font-size]="100"></my-cmp>
N'est pas vraiment adapté si nous faisons beaucoup de raisons.
Possible Solution 5: Remplacer ou étendre le "@Composante" définition avec un supplément de feuille de style en quelque sorte:
Cela semble être la seule solution correcte (au moins pour moi). Mais je n'ai aucune idée de comment faire cela...
Tous les conseils sur ce point? Peut-être que j'ai quelque chose de mal...
Merci.
Vous devez vous connecter pour publier un commentaire.
Pour la solution 5, vous devez créer une sous-classe de la cible de composant, de créer un décorateur qui gère /remplace les métadonnées pour la sous composante.
Voici un exemple:
La
CustomComponent
décorateur devrait ressembler à ceci:Voir cette question pour plus de détails:
Angulaire 4, Nous pouvons remplacer le style avec le
::ng-deep
pseudo-sélecteur de classe de la classe héritée de la feuille de style.Pour plus d'informations, reportez-vous http://blog.angular-university.io/angular-ngclass-ngstyle/
Cela s'applique uniquement si vous utilisez
ViewEncapsulation.Native
.Si vous utilisez
ViewEncapsulation.Emulated
(par défaut), alors Angulaire utilise sa propre interprétation de/deep/
et::shadow
et l'amortissement ne s'applique pas.Si vous utilisez
ViewEncapsulation.Native
alors vous êtes actuellement hors de la chance parce que le navigateur natif::shadow
et/deep/
profonde sont obsolètes et Angulaire ne permet pas encore de fournir un soutien pour themeing soutien pourViewEncapsulation.Native
comme par exemple en Polymère avec (polyfilled) CSS variables et mixin.De départ Angulaire 2.3, nous pouvons utiliser un composant de l'héritage. Afin d'accomplir votre Solution de 5 nous pourrions le faire.