J'ai un footerController et un codeScannerController avec des vues différentes.
angular.module('myApp').controller('footerController', ["$scope", function($scope) {}]);
angular.module('myApp').controller('codeScannerController', ["$scope", function($scope) {
console.log("start");
$scope.startScanner = function(){...
Lorsque je clique sur un <li>
fichier footer.html, je devrais obtenir cet événement dans codeScannerController.
<li class="button" ng-click="startScanner()">3</li>
Je pense que cela peut être réalisé avec $on
et $broadcast
, mais je ne sais pas comment et ne peux trouver d'exemples nulle part.
javascript
angularjs
Alice Polansky
la source
la source
$scope.$apply()
n'est nécessaire que lorsque vous modifiez le modèle en dehors du cadre angulaire (comme dans un setTimeout, un rappel de dialogue ou un rappel ajax), en d'autres termes, il$apply()
est déjà déclenché une fois que tout le code.$on()
est terminé.Tout d' abord, une brève description de
$on()
,$broadcast()
et$emit()
:.$on(name, listener)
- Écoute un événement spécifique par une donnéename
.$broadcast(name, args)
- Diffusez un événement à travers$scope
tous les enfants.$emit(name, args)
- Émettre un événement dans la$scope
hiérarchie à tous les parents, y compris le$rootScope
Basé sur le code HTML suivant (voir l'exemple complet ici ):
Les événements déclenchés se déplacent
$scopes
comme suit:$scope
$scope
puis$rootScope
$scope
puis le contrôleur 3$scope
$scope
puis$rootScope
$scope
$scope
, le contrôleur 2$scope
puis$rootScope
$rootScope
et$scope
de tous les contrôleurs (1, 2 puis 3)$rootScope
JavaScript pour déclencher des événements (encore une fois, vous pouvez voir un exemple de travail ici ):
la source
Une chose que vous devez savoir est que $ prefix fait référence à une méthode angulaire, $$ prefixes fait référence aux méthodes angulaires que vous devez éviter d'utiliser.
ci-dessous est un exemple de modèle et ses contrôleurs, nous explorerons comment $ broadcast / $ on peut nous aider à réaliser ce que nous voulons.
Les contrôleurs sont
Ma question est de savoir comment transmettre le nom au deuxième contrôleur lorsqu'un utilisateur clique sur s'inscrire? Vous pouvez trouver plusieurs solutions, mais celle que nous allons utiliser utilise $ broadcast et $ on.
$ broadcast vs $ emit
Que devrions-nous utiliser? $ broadcast canalisera tous les éléments dom enfants et $ emit canalisera la direction opposée vers tous les éléments dom ancêtre.
La meilleure façon d'éviter de choisir entre $ emit ou $ broadcast est de canaliser depuis $ rootScope et d'utiliser $ broadcast à tous ses enfants. Ce qui rend notre cas beaucoup plus facile puisque nos éléments dom sont des frères et sœurs.
Ajout de $ rootScope et laisse $ broadcast
Notez que nous avons ajouté $ rootScope et maintenant nous utilisons $ broadcast (broadcastName, arguments). Pour broadcastName, nous voulons lui donner un nom unique afin que nous puissions saisir ce nom dans notre secondCtrl. J'ai choisi BOOM! juste pour le fun. Le second argument «arguments» nous permet de transmettre des valeurs aux écouteurs.
Recevoir notre émission
Dans notre deuxième contrôleur, nous devons configurer du code pour écouter notre diffusion
C'est vraiment aussi simple que cela. Exemple en direct
Autres moyens d'obtenir des résultats similaires
Essayez d'éviter d'utiliser cette suite de méthodes car elle n'est ni efficace ni facile à entretenir, mais c'est un moyen simple de résoudre les problèmes que vous pourriez avoir.
Vous pouvez généralement faire la même chose en utilisant un service ou en simplifiant vos contrôleurs. Nous ne discuterons pas de cela en détail, mais je pensais simplement le mentionner pour être complet.
Enfin, gardez à l'esprit qu'une diffusion vraiment utile à écouter est à nouveau «$ destroy», vous pouvez voir le $ signifie que c'est une méthode ou un objet créé par les codes du fournisseur. Quoi qu'il en soit, $ destroy est diffusé lorsqu'un contrôleur est détruit, vous pouvez l'écouter pour savoir quand votre contrôleur est supprimé.
la source
la source