Quelle bonne question! J'avais de l'amour pour entendre ce que les autres ont à dire, mais ici sont les lignes directrices que j'utilise.
La haute altitude de ce principe: la portée est utilisé comme la "colle" que nous utilisons pour communiquer entre le contrôleur de parent, de la directive et de la directive modèle.
Parent: scope: false
, donc pas de nouveau champ d'application à tous les
Je ne l'utilise pas très souvent, mais comme @MarkRajcok dit, si la directive n'a pas accès à toute la portée des variables (et évidemment ne définit pas tout!) alors c'est tout simplement parfait pour autant que je suis concerné. C'est également utile pour les enfants des directives qui sont uniquement utilisées dans le contexte de la société mère de la directive (mais il y a toujours des exceptions) et qui n'ont pas de modèle. Fondamentalement, quelque chose avec un modèle qui n'appartient pas, le partage d'un champ, parce que vous êtes intrinsèquement exposant que l'étendue de l'accès et de manipulation (mais je suis sûr qu'il y a des exceptions à cette règle).
Comme un exemple, j'ai créé récemment une directive qui dessine un (statique) des graphiques vectoriels à l'aide d'une SVG de la bibliothèque, je suis dans le processus de l'écriture. C' $observe
s deux attributs (width
et height
) et les utilise dans ses calculs, mais il ne fixe ni ni lit toute la portée des variables et n'a pas de modèle. C'est un bon cas d'utilisation à ne pas en créer un autre champ; nous n'en avons pas besoin, alors pourquoi s'embêter?
Mais dans un autre SVG directive, cependant, j'ai tenu un ensemble de données à utiliser et en outre eu pour stocker un tout petit peu de l'état. Dans ce cas, à l'aide de la portée parent serait irresponsable (encore une fois, d'une manière générale). Ainsi, au lieu...
Enfant: scope: true
Directives avec un enfant de la portée du compte du contexte et sont destinés à interagir avec le champ d'application actuel.
Évidemment, un avantage clé de ce sur un isolat portée est que l'utilisateur est libre d'utiliser l'interpolation sur les attributs qu'ils veulent, par exemple, à l'aide de class="item-type-{{item.type}}"
sur une directive avec un isolat champ d'application ne fonctionnera pas par défaut, mais fonctionne très bien sur l'autre avec un enfant car tout ce qui est interpolée peut toujours, par défaut, être trouvé dans la portée parent. Aussi, la directive elle-même peut évaluer en toute sécurité des attributs et des expressions dans le contexte de son propre champ d'application sans se soucier de la pollution ou des dommages à la société mère.
Par exemple, une info-bulle est quelque chose qui est ajouté; un isolat champ d'application ne fonctionne pas (par défaut, voir ci-dessous) car il est prévu que nous allons utiliser d'autres directives ou interpolées attributs ici. L'info-bulle est juste une amélioration. Mais l'info-bulle a également besoin de mettre certaines choses sur le champ d'application à utiliser avec un sous-directive et/ou d'un modèle et, évidemment, de gérer son propre état, de sorte qu'il serait tout à fait mauvaise, en effet, l'utilisation de la portée parent. Nous sommes soit le polluant ou de l'endommager, et ni est bueno.
Je trouve moi-même à l'aide de l'enfant étendues plus souvent que de l'isoler ou étendues parents.
Isoler portée: scope: {}
C'est pour composants réutilisables. :-)
Mais sérieusement, je pense que des "composants réutilisables" comme "composantes autonomes". Le but est qu'ils sont à être utilisé dans un but précis, afin de les combiner avec d'autres directives ou d'ajouter d'autres interpolées attributs du nœud DOM, intrinsèquement, ne fait pas de sens.
Pour être plus précis, rien besoin de cette fonctionnalité autonome est fourni par les attributs évalués dans le contexte de la portée parent; ils sont un moyen de cordes ('@'), les expressions ('&'), ou une variable de liaisons ('=').
Sur des composantes autonomes, il n'a pas de sens à la nécessité d'appliquer d'autres directives ou des attributs sur elle parce qu'elle existe par elle-même. Son style est régi par son propre modèle (si nécessaire) et peut avoir le contenu approprié transcluded (si nécessaire). Il est autonome, donc nous l'avons mis dans un isolat portée aussi de dire: "Ne plaisante pas avec cela. Je vais vous donner un définies API à travers ces quelques attributs."
Une bonne pratique consiste à exclure autant basés sur le modèle des trucs de la directive lien et les fonctions du contrôleur que possible. Cela fournit un autre "API" comme de la configuration de point: l'utilisateur de la directive suffit de remplacer le modèle! La fonctionnalité reste la même, et son API interne n'a jamais été touché, mais on peut mess avec le style et DOM la mise en œuvre autant que nous en avons besoin. ui/bootstrap est un excellent exemple de la façon de le faire parce que Peter & Pawel sont impressionnantes.
Isoler les étendues sont également idéal pour une utilisation avec transclusion. Prendre des onglets; ils ne sont pas seulement l'ensemble des fonctionnalités, mais tout ce qui est à l'intérieur de celui-ci peut être évaluée librement à partir de l'intérieur de la portée parent tout en laissant les pattes (et volets) à faire ce qu'ils veulent. Les onglets ont clairement leur propre état, qui appartient au champ d'application (pour interagir avec le modèle), mais que l'état n'a rien à voir avec le contexte dans lequel il a été utilisé - il est entièrement interne à ce qui fait un onglet directive sur l'onglet de la directive. De plus, il n'a pas beaucoup de sens d'utiliser toutes les autres directives avec les onglets. Ils sont les onglets - et nous avons déjà obtenu que la fonctionnalité!
L'entourer avec plus de fonctionnalités, ou transclude plus de fonctionnalités, mais la directive est ce qu'il est déjà.
Tout ce que dit, je remarque qu'il y a des façons de contourner certaines limitations (c'est à dire les caractéristiques) d'un isolat de portée, comme @ProLoser fait allusion dans sa réponse. Par exemple, l'enfant du champ de l'article, j'ai mentionné l'interpolation sur la non-directive sur les attributs de la rupture lors de l'utilisation d'un isolat champ d'application (par défaut). Mais l'utilisateur pourrait, par exemple, il suffit d'utiliser class="item-type-{{$parent.item.type}}"
et il aurait une fois de plus le travail. Donc, si il ya une raison impérieuse d'utiliser un isolat de la portée d'un enfant de la portée, mais vous êtes inquiet au sujet de certaines de ces limitations, sachez que vous pouvez travailler autour de pratiquement tous d'entre eux si vous en avez besoin.
Résumé
Les Directives aucun nouveau champ d'application sont en lecture seule; ils sont entièrement digne de confiance (c'est à dire interne à l'application) et qui ne touchent pas à jack. Les Directives de l'enfant portée ajouter des fonctionnalités, mais ils ne sont pas la seule fonctionnalité. Enfin, isoler les étendues de directives, l'ensemble de l'objectif; ils sont autonomes, de sorte qu'il est normal (et la plus "correcte"), pour se laisser aller voyous.
Je voulais faire mes premières réflexions, mais comme je le pense de plus en plus de choses, je vais mettre à jour ce. Mais holy crap - c'est long une SORTE de réponse...
PS: Totalement dans le sens tangentiel, mais puisque nous parlons étendues, je préfère dire "prototypique", tandis que d'autres préfèrent "prototypes", qui semble être plus précis, mais juste le sort de la langue pour ne pas bien du tout. :-)