Est-il possible qu'un contrôleur utilise un autre?
Par exemple:
Ce document HTML imprime simplement un message délivré par le MessageCtrl
contrôleur dans le messageCtrl.js
fichier.
<html xmlns:ng="http://angularjs.org/">
<head>
<meta charset="utf-8" />
<title>Inter Controller Communication</title>
</head>
<body>
<div ng:controller="MessageCtrl">
<p>{{message}}</p>
</div>
<!-- Angular Scripts -->
<script src="http://code.angularjs.org/angular-0.9.19.js" ng:autobind></script>
<script src="js/messageCtrl.js" type="text/javascript"></script>
</body>
</html>
Le fichier du contrôleur contient le code suivant:
function MessageCtrl()
{
this.message = function() {
return "The current date is: " + new Date().toString();
};
}
Qui imprime simplement la date actuelle;
Si je devais ajouter un autre contrôleur, DateCtrl
qui a remis la date dans un format spécifique MessageCtrl
, comment procéderait-on? Le cadre DI semble s'intéresser XmlHttpRequests
aux services et y accéder.
javascript
html
angularjs
BanksySan
la source
la source
Réponses:
Il existe plusieurs façons de communiquer entre les contrôleurs.
Le meilleur est probablement de partager un service:
Une autre façon est d'émettre un événement sur la portée:
Dans les deux cas, vous pouvez également communiquer avec n'importe quelle directive.
la source
Voir ce violon: http://jsfiddle.net/simpulton/XqDxG/
Regardez également la vidéo suivante: Communiquer entre les contrôleurs
Html:
javascript:
la source
Si vous souhaitez appeler un contrôleur dans un autre, quatre méthodes sont disponibles
Le contrôleur et sa portée peuvent être détruits, mais $ rootScope reste dans l'application, c'est pourquoi nous prenons $ rootScope parce que $ rootScope est le parent de toutes les portées.
Si vous effectuez une communication du parent à l'enfant et que même l'enfant souhaite communiquer avec ses frères et sœurs, vous pouvez utiliser $ broadcast
Si vous effectuez une communication de l'enfant au parent, aucun frère ou sœur n'est impliqué, vous pouvez utiliser $ rootScope. $ Emit
HTML
Code Angularjs
Dans la console de code ci-dessus, $ emit 'childEmit' n'appellera pas à l'intérieur des frères et sœurs enfants et il appellera uniquement à l'intérieur du parent, où $ broadcast sera également appelé à l'intérieur des frères et sœurs.C'est l'endroit où les performances entrent en action. préférable, si vous utilisez la communication de l'enfant à ses parents, car elle saute quelques vérifications sales.
C'est l'une des meilleures méthodes, si vous voulez faire une communication parent-enfant là où l'enfant veut communiquer avec le parent immédiat, alors il n'aurait besoin d'aucune sorte $ broadcast ou $ emit mais si vous voulez faire la communication du parent à l'enfant, vous devez utiliser le service ou $ broadcast
Par exemple HTML: -
Angularjs
Chaque fois que vous utilisez la communication enfant-parent, Angularjs recherchera une variable à l'intérieur de l'enfant. Si elle n'est pas présente à l'intérieur, elle choisira de voir les valeurs à l'intérieur du contrôleur parent.
AngularJS prend en charge les concepts de "séparation des préoccupations" en utilisant l'architecture des services. Les services sont des fonctions javascript et sont chargés de faire des tâches spécifiques uniquement, ce qui en fait une entité individuelle qui est maintenable et testable .Services utilisés pour injecter en utilisant le mécanisme d'injection de dépendance d'Angularjs.
Code angularjs:
Il donnera la sortie Hello Child World et Hello Parent World. Selon Angular docs of services Singletons - Chaque composant dépendant d'un service obtient une référence à l'instance unique générée par la fabrique de services .
Cette méthode obtient scope () de l'élément par sa méthode Id / unique class.angular.element () renvoie element et scope () donne la variable $ scope d'une autre variable en utilisant la variable $ scope d'un contrôleur à l'intérieur d'un autre n'est pas une bonne pratique.
HTML: -
Angularjs: -
Dans le code ci-dessus, les contrôleurs affichent leur propre valeur en HTML et lorsque vous cliquerez sur du texte, vous obtiendrez des valeurs dans la console en conséquence. Si vous cliquez sur la portée des contrôleurs parents, le navigateur consolera la valeur de l'enfant et vice versa.
la source
Voici un exemple d'une page de deux contrôleurs partageant des données de service:
Également ici: https://gist.github.com/3595424
la source
theService
mises à jourthing.x
, alors ce changement se propage automatiquement aux <input> dansFirstCtrl
etSecondCtrl
, non? Et on peut également changerthing.x
directement via l'un des deux <input> (non?).Si vous cherchez à émettre et à diffuser des événements pour partager des données ou des fonctions d'appel entre contrôleurs , veuillez consulter ce lien : et vérifiez la réponse par
zbynour
(réponse avec un maximum de votes). Je cite sa réponse !!!Si la portée de firstCtrl est parent de la portée secondCtrl, votre code devrait fonctionner en remplaçant $ emit par $ broadcast dans firstCtrl:
Dans le cas où il n'y a pas de relation parent-enfant entre vos étendues, vous pouvez injecter $ rootScope dans le contrôleur et diffuser l'événement à toutes les étendues enfants (c'est-à-dire aussi secondCtrl).
Enfin, lorsque vous devez répartir l'événement du contrôleur enfant vers des étendues vers le haut, vous pouvez utiliser $ scope. $ Emit. Si l'étendue de firstCtrl est parent de l'étendue de secondCtrl:
la source
Deux autres violons: (approche hors service)
1) Pour le contrôleur parent-enfant - Utilisation
$scope
du contrôleur parent pour émettre / diffuser des événements. http://jsfiddle.net/laan_sachin/jnj6y/2) Utilisation
$rootScope
sur plusieurs contrôleurs non liés. http://jsfiddle.net/VxafF/la source
En fait, utiliser émettre et diffuser est inefficace car l'événement bouillonne de haut en bas dans la hiérarchie de la portée, ce qui peut facilement se dégrader en réduction des performances pour une application complexe.
Je suggère d'utiliser un service. Voici comment je l'ai récemment implémenté dans l'un de mes projets - https://gist.github.com/3384419 .
Idée de base - enregistrer un bus pub-sub / événement en tant que service. Ensuite, injectez ce bus d'événements partout où vous devez vous abonner ou publier des événements / sujets.
la source
Je connais aussi cette façon.
Mais je ne l'utilise pas trop, car je n'aime pas utiliser les sélecteurs jQuery en code angulaire.
la source
Il existe une méthode qui ne dépend pas des services,
$broadcast
ou$emit
. Ce n'est pas approprié dans tous les cas, mais si vous avez 2 contrôleurs associés qui peuvent être résumés en directives, alors vous pouvez utiliser l'require
option dans la définition de directive. C'est probablement la façon dont ngModel et ngForm communiquent. Vous pouvez l'utiliser pour communiquer entre des contrôleurs de directives imbriqués ou sur le même élément.Pour une situation parent / enfant, l'utilisation serait la suivante:
Et les points principaux pour le faire fonctionner: Sur la directive parent, avec les méthodes à appeler, vous devez les définir sur
this
(pas sur$scope
):Dans la définition de la directive enfant, vous pouvez utiliser l'
require
option pour que le contrôleur parent soit passé à la fonction de liaison (afin que vous puissiez ensuite y appeler des fonctions à partirscope
de la directive enfant.Ce qui précède peut être vu à http://plnkr.co/edit/poeq460VmQER8Gl9w8Oz?p=preview
Une directive frère est utilisée de la même manière, mais les deux directives sur le même élément:
Utilisé en créant une méthode sur
directive1
:Et dans directive2, cela peut être appelé en utilisant l'
require
option qui entraîne le passage de siblingController à la fonction de liaison:Cela peut être vu à http://plnkr.co/edit/MUD2snf9zvadfnDXq85w?p=preview .
Les utilisations de cela?
Parent: Tout cas où les éléments enfants doivent «s'enregistrer» eux-mêmes auprès d'un parent. Tout comme la relation entre ngModel et ngForm. Ceux-ci peuvent ajouter certains comportements qui peuvent affecter les modèles. Vous pouvez également avoir quelque chose de purement basé sur DOM, où un élément parent doit gérer les positions de certains enfants, par exemple pour gérer ou réagir au défilement.
Fratrie: permettre à une directive de voir son comportement modifié. ngModel est le cas classique, pour ajouter des analyseurs / validation à l'utilisation de ngModel sur les entrées.
la source
Je ne sais pas si cela est hors normes mais si vous avez tous vos contrôleurs sur le même fichier, vous pouvez faire quelque chose comme ceci:
Comme vous pouvez le voir, indicateursCtrl appelle les fonctions updateChart des deux autres contrôleurs lors de l'appel à updateCharts.
la source
Vous pouvez injecter le service '$ controller' dans votre contrôleur parent (MessageCtrl) puis instancier / injecter le contrôleur enfant (DateCtrl) en utilisant:
$scope.childController = $controller('childController', { $scope: $scope.$new() });
Vous pouvez maintenant accéder aux données de votre contrôleur enfant en appelant ses méthodes car il s'agit d'un service.
Faites-moi savoir s'il y a un problème.
la source
Voici une
publish-subscribe
approche qui est indépendante de JS angulaire.Contrôleur de paramètres de recherche
Contrôleur de choix de recherche
Responsable de l'événement
Global
la source
Dans la version 1.5 angulaire, cela peut être accompli en procédant comme suit:
Il s'agit du composant parent. En cela, j'ai créé une fonction qui pousse un autre objet dans mon
productForms
tableau - note - ceci est juste mon exemple, cette fonction peut être n'importe quoi vraiment.Nous pouvons maintenant créer un autre composant qui utilisera
require
:Ici, le composant enfant crée une référence à la fonction du composant parents
addNewForm
qui peut ensuite être liée au HTML et appelée comme toute autre fonction.la source