ng-repeat dans la directive personnalisée
Question
J'ai donc du mal à transmettre la portée de mes directives personnalisées.
Voici mon HTML
<li ng-repeat="post in posts | filter:search | orderBy:sortField:reverse" class="archives-listing" ng-class="{'last-border':$last}">
<archive-notes></archive-notes>
</li>
Voici mes directives
app.directive('archiveNotes', function(){
return {
restrict: 'E',
transclude: true,
scope: {
notes: '@',
paths: '@'
},
controller: function($scope) {
},
templateUrl: '/wp-content/themes/twentythirteen/js/angular/templates/notes.html'
}
})
app.directive('archiveFolders', function(){
return {
require: '^archiveNotes',
restrict: 'E',
transclude: true,
scope: {
path: '@'
},
link: function(scope, element, attrs) {
},
templateUrl: '/wp-content/themes/twentythirteen/js/angular/templates/folders.html'
}
});
voici mes modèles.
notes.html
<div ng-class="{'found' : find(post.paths[$index], search)}" class="arch-notes">
<div ng-bind-html="is_NotesEmpty(post.notes)">{{post.notes}}</div>
<archive-folders></archive-folders>
</div>
folders.html
<div ng-repeat="path in post.paths | filter:search track by $index" ng-transclude>
<span class="arch-paths">{{path}}</span>
</div>
J'ai laissé plusieurs choses vides i.e controller and link
parce qu'à ce stade, j'essayais juste de comprendre comment tout faire apparaître avant de commencer à manipuler le DOM
J'ai suivi l'exemple de la documentation d'Angularjs, et cela m'a mené jusqu'ici.Je suppose que je n'arrive pas à comprendre comment accéder au scope ?
Toute aide est appréciée.
La solution
D'après vos modèles, il semble que votre archiveNotes
la définition de la directive devrait en fait ressembler à ceci :
app.directive('archiveNotes', function(){
return {
...
scope: {
post: '='
},
...
}
})
Pour obtenir le post
variable transmise depuis ng-repeat
la portée de, vous devez également définir le post
attribut sur l'élément de la directive :
<archive-notes post="post"></archive-notes>
De même, vous devez le définir sur la directive enfant :
app.directive('archiveFolders', function(){
return {
...
scope: {
post: '='
},
...
}
});
...et changez votre notes.html
modèle:
<archive-folders post="post"></archive-folders>
Isolate scope est un peu comme un pare-feu, dans lequel vous pouvez définir des exceptions, dans ce cas sur des variables de portée spécifiques.Tout ce que nous faisons ici, c'est définir ces exceptions dans les définitions de directive, puis les transmettre en utilisant l'attribut sur les éléments.
Ces vidéos de John Lindquist m'ont vraiment éclairé sur la portée d'isolement :