Communiquer avec les directives de la fratrie
Objectif: Créer des comportements à l'aide des directives de communication entre les 2 éléments frères (chacun leur propre directive).
Un comportement à utiliser dans l'exemple: Le contenu de l'article est masqué par défaut. Lorsque le titre est cliqué, je veux un article de contenu à afficher.
Le hic: L'article associé éléments doivent associer les uns aux autres sans être imbriqué dans un seul parent de l'élément ou de la directive.
<div article="article1">this is my header</div>
<div id="article1" article-content>this is content for the header above</div>
<div article="article2">this is my header</div>
<div id="article2" article-content>this is content for the header above</div>
Je sais qu'il serait plus facile de placer le contenu dans l'article de la directive, cependant, cette question est de trouver comment résoudre ce genre de situation.
Le contenu de la directive passer lui-même à l'article de la directive en quelque sorte?
Ce code n'est pas très utile, car elle est maintenant, mais c'est un point de départ. Comment pourrais-je accomplir?
.directive('article', function(){
return {
restrict: "A",
controller: function($scope) {
$scope.contentElement = null;
this.setContentElement = function(element) {
$scope.contentElement = element;
}
},
link: function(scope, element) {
element.bind('click', function(){
//Show article-content directives that belong
//to this instance (article1) of the directive
}
}
}
}
.directive('articleContent', function(){
return {
require: "article",
link: function(scope, element, attrs, articleCtrl) {
//Maybe reference the article i belong to and assign element to it?
//I can't though because these are siblings.
}
}
}
- Fait intéressant à noter, dans le $compiler le code source doc chaînes de caractères siblingDirectiveName est répertorié comme la première valeur possible le besoin de la propriété peut prendre. Malheureusement "siblingDirectiveName" ne pas obtenir de nouveau mentionnée dans la documentation, et il n'y a pas de travail exemples.
Vous devez vous connecter pour publier un commentaire.
Aucun de la directive
require
les options vous permettent d'exiger, de frère, de directives (autant que je sache). Vous pouvez seulement:require: "directiveName"
require: "^directiveName"
require: "^?directiveName"
si vous n'avez pas nécessairement besoin du contrôleur de parentrequire: "^\?directiveName"
si vous n'avez pas nécessairement besoin du parent DOM wrapperSi vous voulez frères et sœurs de la communication, vous aurez pour la maison en quelque parent de l'élément DOM avec une directive contrôleur agissant comme une API pour leur communication. Comment cela est mis en œuvre dépend en grande partie du contexte à la main.
Ici est un bon exemple de Angular JS (O'Reilly)
D'utilisation (jade templating):
Ou vous pouvez créer un
service
juste pour directive de la communication, un avantage de spécialservice
vsrequire
est que vos directives ne dépendra pas de leur emplacement dans la structure html.service C
est utilisé pour faciliter la communication entreservice A
etservice B
. Afin de vous injecterservice C
à la fois dansservice A
etservice B
. L'une des solutions pour code est pourservice C
pour contenir de référence à la fois àservice A
etservice B
. Donc, à partir de l'intérieur deservice A
vous pouvez communiquer avecservice B
comme ceci:serviceC.getServiceB().methodOnServiceB()
service C
doncA
etB
ou de tout autre service qui aservice C
injecté, écouter ces événements et d'agir en conséquence.Les solutions ci-dessus sont grands, et vous devriez certainement envisager l'aide d'un parent pour permettre la communication entre vos directives. Toutefois, si votre application est assez simple, il y a une méthode très simple construit dans Angulaire qui peuvent communiquer entre deux frère étendues sans l'aide de n'importe quel parent:
$emit
,$broadcast
, et$on
.Disons par exemple que vous avez une assez simple application de la hiérarchie avec une barre de navigation zone de recherche qui puise dans une fonction complexe, et vous avez besoin de ce service pour diffuser les résultats de diverses autres directives sur la page. Une façon de le faire serait comme ceci:
dans le service de recherche
dans certains autres directives/contrôleurs de
Il y a une certaine beauté à la façon simple que le code est. Cependant, il est important de garder à l'esprit qui émettent le/sur/la diffusion de la logique peut se gâter très rapidement si vous avez un tas de différents endroits de la radiodiffusion et de l'écoute. Une rapide recherche sur google peut tourner beaucoup d'opinions sur le moment où il est et n'est pas un anti-modèle.
Certains bon aperçu des émettent/diffusion/dans ces postes:
http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
http://nathanleclaire.com/blog/2014/04/19/5-angularjs-antipatterns-and-pitfalls/
Si il y a une liste d'articles et de son contenu, nous pouvons le faire sans aucune directive, à l'aide de ng-repeat
Si vous avez besoin de définir le modèle article dans le contrôleur. Nous utilisons une portée locale créée par ng-repeat.
Mise à jour: en Fonction de vos commentaires, vous avez besoin de les relier.Vous pouvez essayer de
et dans votre directive
utilisation
Et le final de la méthode pourrait être d'utiliser
$rootScope.$broadcast
etscope.$on
méthodes de communication entre les contrôleurs. Mais dans cette approche, vous avez besoin de suivre d'où le message est venu et qui est le destinataire qui doit la traiter.J'ai eu exactement le même problème et j'ai été en mesure de le résoudre.
Afin d'obtenir une directive pour cacher d'autres, de frère, de directives, j'ai utilisé un parent directive pour agir à titre de l'API. Un enfant de la directive dit à la mère qu'il n'a pas à être affichés ou masqués par le passage d'une référence à son élément, et l'autre enfant appelle le parent fonction de bascule.
http://plnkr.co/edit/ZCNEoh
J'ai eu le même problème avec un tout sélectionner/sélectionner un élément de la directive j'ai écrit. Ma question est la case sélectionner tout était dans une table d'en-tête de rangée et de la sélection de l'élément a dans le corps de table. J'ai eu autour de lui par la mise en œuvre d'un pub/sub notification service, de sorte que les directives pourraient parler les uns aux autres. De cette façon, mon directive ne se soucient pas comment mon htlm a été structuré. Je voulais vraiment utiliser le nécessite bien, mais à l'aide d'un service de travaillé aussi bien.