Obtenir une référence à une directive utilisé dans un composant
J'ai un composant dont le modèle ressemble à quelque chose comme ceci:
<div [my-custom-directive]>Some content here</div>
J'ai besoin d'accéder à la MyCustomDirective
instance de classe utilisé ici. Quand je veux accéder à un composant enfant, j'utilise un ViewChild
requête.
Est-il une fonctionnalité équivalente à obtenir l'accès à un enfant de la directive?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
exportAs
propriété de la@Directive
annotation. Il exportations de la directive à être utilisé dans la vue parent. À partir de la vue parent, vous pouvez le lier à une variable de vue et d'y accéder à partir de la classe parent à l'aide de@ViewChild()
.Exemple Avec un plunker:
Mise à jour
Comme mentionné dans les commentaires, il y a une autre alternative à l'approche ci-dessus.
Au lieu d'utiliser
exportAs
, on pourrait directement utiliser@ViewChild(MyCustomDirective)
ou@ViewChildren(MyCustomDirective)
Voici un peu de code pour démontrer la différence entre les trois approches:
Mise à jour
Un autre plunker avec plus de précisions
cdire
directement comme,@ViewChild(MyCustomDirective) element:MyCustomDirective;
Puis, dansngAfterViewInit - this.element.logSomething('text from...')
. Alors, pourquoi votre approche lorsque les directement par juste de passage le type, vous pouvez le faire? Juste pour la clarification.MyCustomDirective
. S'il y a plusieurs directives, il va correspondre à la première. Mais, lors de l'utilisation deexportAs
, vous pouvez spécifier un élément en particulier, par exemple, la deuxièmeMyCustomDirective
.@ViewChildren()
ViewChild()
, sauf si vous voulez que tous ou de la première instance de ce type. J'ai ajouté le nouveau plunkerSecond
sans l'aide deexportAs
?@ViewChild('cdire', {read:MyCustomDirective}) secondMyCustomDirective: MyCustomDirective
, et<div #cdire my-custom-directive>Second</div>
(pas de exportAs nécessaire).exportAs
. Très bon point! Merci!Il semble que depuis @Abdulrahman réponse, les directives peuvent ne plus être accessibles à partir de
@ViewChild
ou@ViewChildren
que ces seuls éléments sur l'élément DOM lui-même.Au lieu de cela, vous devez accéder à des directives à l'aide de
@ContentChild
/@ContentChildren
.Il n'est pas non plus un
directives
bien sur@Component
attribut.this.firstMyCustomDirective
estundefined
La seule solution restante à compter de 2019
Comme mentionné dans les commentaires des autres réponses, à ces autres (précédemment en vigueur) méthodes ne fonctionne pas avec les versions les plus récentes Angulaire.
Réjouissez-vous, cependant, car il y a un moyen encore plus simple façon de l'obtenir injecté: directement à partir du constructeur!
En outre, vous pouvez ajouter des annotations à dire l'Injection de Dépendance moteur où regarder pour le contenu à injecter, à l'aide de @Auto ou @Facultatif par exemple