angularjs hériter de portée dans les directives
exemple: http://jsfiddle.net/avowkind/PS8UT/
Je veux un imbriquée enfant directive pour obtenir ses données de son emballage parent directive, le cas échéant, sinon de l'extérieur du contrôleur.
<div ng-controller="MyCtrl">
<parent index="1">
<child></child>
</parent>
<parent index="2">
<child></child>
</parent>
<h1>No Parent</h1>
<child></child>
</div>
<hr>
De sortie désiré
Parent 1
Child of parent 1
Parent 2
Child of parent 2
No Parent
Child of parent 0
Actuellement mon enfant objet, il ne voit que l'extérieur de la valeur du contrôleur:
De sortie réelle
Parent 1
Child of parent 0
Parent 2
Child of parent 0
No Parent
Child of parent 0
C'est la version simple; en réalité l'extérieur directives obtenir les données à partir d'un serveur qui est mis en forme par les imbriqué enfant pour ce qui est communiqué est un objet complexe n'est pas une simple chaîne de caractères.
En outre, l'enfant est une visualisation qui vont travailler sur différents jeux de données, de sorte que l'extérieur de la mère de la directive n'est pas toujours le même type.
Plus généralement, le modèle que j'essaye de faire ici est d'avoir séparé les directives pour remplir le modèle et la visualisation. de manière plus réaliste l'utilisation serait
<temperature-for city="Auckland">
<plot/>
<analysis/>
</temperature-for>
<humidity-for city="Hamilton">
<plot/>
<analysis/>
</temperature-for>
<test-data>
<plot/>
</test-data>
?^
dans le require
option.OriginalL'auteur avowkind | 2014-04-01
Vous devez vous connecter pour publier un commentaire.
Une approche différente qui j'ai personnellement eu beaucoup de succès en est de définir l'intrigue et de l'analyse des directives isoler étendues, et puis les deux sens de lier l'entrée requise.
De cette façon, la directive sont complètement autonome composants, avec un explicite, interface définie. Personnellement, j'ai fait un tracé directive comme ceci:
De cette façon, il n'y a pas de confusion quelles sont les données nécessaires pour cette composante de travailler, et vous pouvez écrire de la documentation à l'intérieur de la directive pour l'entrée souhaitée attributs.
Dans l'ensemble, c'est un modèle qui fonctionne très bien pour une grande partie des cas d'utilisation dans AngularJS, c'est à dire à chaque fois qu'il y a un cas pour la réutilisabilité.
Edit:
Voulais juste ajouter que: en Regardant votre code HTML, il n'y a absolument aucune indication à ce que ces directives d'utilisation, ils peuvent compter sur quoi que ce soit (par exemple, font-ils obtenir toutes les données à partir d'un service? ou ils ne dépendent d'un parent? Si oui, de quelle ampleur?)
OriginalL'auteur SveinT
Il ya un couple de façons de le faire, mais en supposant que vous voulez vraiment utiliser les étendues parents voici une solution pour aller avec votre violon.
Vous pouvez voir une fourche de votre violon ici.
L'idée est qu'en se débarrassant de la ngTranscludeDirective et la création manuelle de la transclusion, vous pouvez lier la transclusion avec le champ d'application de votre choix. Ensuite, vous pouvez ajouter le résultat à l'endroit où vous le souhaitez dans l'élément résultant de votre directive de compilation.
L'autre point principal est de s'assurer que l'enfant directive ne crée pas de champ d'application (à tous, que ce soit un isolat portée, transcluded portée, ou nouvelles).
Je pense que cela va vous donner les résultats que vous demandez.
REMARQUE: l'Étude de votre étendues bien, parce que peaufiner ces comportements peuvent avoir des résultats inattendus.
Par exemple, si vous ajoutez une fonction de liaison à l'enfant de la directive et qu'il définit indice 5:
cela n'affectera pas
scope.items
pour les enfants imbriquée dans le parent. Cependant, il AURA une incidence sur l'externe parent (dans ce cas MyCtrl du champ d'application). Aucune directive n'est pas à l'intérieur d'un parent directive n'aura de cesse de modifier la MyCtrl index.Toutefois, si vous ajoutez une nouvelle propriété à la portée de l'enfant en fonction de lien:
scope.somethingElse
sera disponible sur la portée parent si imbriquée dans un parent directive ou pas.Merci, et je comprends parfaitement @avowkind. De nombreuses fois de ne pas la création d'un enfant dans une situation donnée, peuvent causer le plus grand des maux de tête aussi.
OriginalL'auteur Stephen J Barker
Vous aurez besoin de transclude et la finesse de grain en fonction de vos parents directive champ d'application, vous ne pouvez pas le faire à l'aide de la
ng-transclude
directive: http://jsfiddle.net/PS8UT/2/Habituellement, lorsque vous traitez avec des modèles et des transclusion, nécessitant de la part de l'héritage parent, est une douleur.
ng-transclude
de ne pas utiliser votre parent immédiat de la portée en tant que parent, il est habituellement utiliser votre contrôleur de portée. Il est indiqué dans angulaire docs $compiler docs:OriginalL'auteur pocesar