Comment appeler une méthode définie dans la directive enfant, dans un bouton Cliquez sur l'auditeur de la directive mère.
angular.module('editableDivDirective', []) .directive("editableDiv", function() { var directive = {}; directive.restrict = 'E'; directive.replace = 'true'; directive.scope = {}; directive.transclude = 'true'; directive.template = '<div id="wrapper">' + '<div required class="text-area" name="search" contenteditable="true" ng-model="formData.text"></div>' + '<button type="submit" class="btn btn-warning add-button" id="submit" ng-click="createTodo()">Add</button>' + '</div>'; directive.link = function(scope, element, attrs, controller) { scope.createTodo = function(){ // do something // Call child directive setPlaceholderText() } }; return directive; }) .directive("contenteditable", function() { var directive = {}; directive.require = ['^editableDiv','?ngModel']; directive.restrict = 'A'; directive.scope = {}; directive.link = function(scope, element, attrs, ctrls) { var ngModel = ctrls[1]; var editableDivController = ctrls[0]; function setPlaceholderText(){ return element.html("Hello World"); } return directive; })
3 Réponses :
dans votre directive parent dans la directive enfant p>
Merci Mathew. Cela serait-il applicable lorsque les directives ont une lunette isolée?
Vous pouvez programmer un événement à l'enfance (comme mentionné) ou vous pouvez également ajouter une fonction au contrôleur de votre parent directive à partir de votre directive enfant.
Voici un jsfiddle avec des exemples de la directive $ à la fois en une directive enfant et à l'aide de la technique du contrôleur. P>
angular.module("myApp", []) .directive("parentDirective", function () { var directive = {}; directive.restrict = "E"; directive.scope = {}; directive.template = '<div>' + '<button type="button" ng-click="broadcastDemo()">' + 'Broadcast to child' + '</button>' + '<button type="button" ng-click="controllerDemo()">' + 'Use Controller' + '</button><br /><br />' + '<child-directive></child-directive>'; //Setup directive controller directive.controller = function ($scope) { var ctrl = this; //Store events for convenience var events = ctrl.events = { setPlaceHolderText: "setPlaceHolderTextEvent" }; $scope.broadcastDemo = function () { //$broadcast event and optional additional args $scope.$broadcast(events.setPlaceHolderText, "Additional arg1", "Additional arg2"); }; $scope.controllerDemo = function () { //do some work //call the ctrl.setPlaceHolderText added by child if (ctrl.setPlaceHolderText) { ctrl.setPlaceHolderText(); } }; }; return directive; }) .directive("childDirective", function () { var directive = {}; directive.restrict = "E"; directive.scope = {}; directive.require = ["^parentDirective", "?ngModel"]; directive.template = '<div></div>'; directive.link = function (scope, elem, attrs, ctrl) { var parentDirCtrl = ctrl[0]; //allow parent scope(s) to $broadcast event scope.$on(parentDirCtrl.events.setPlaceHolderText, function (event, arg1, arg2) { elem.html("$Broadcast: " + arg1 + " " + arg2); }); //Add function to parent controller parentDirCtrl.setPlaceHolderText = function () { elem.html("Added to parent controller!"); } }; return directive; });
La diffusion n'est pas préférée, car s'il y a plusieurs instance d'enfant ou même une combinaison enfant parent, la diffusion déclenchera tout. P>
Quel est votre cas d'utilisation spécifique? Qu'avez-vous essayé?
@Patrick j'ai ajouté plus de détails. Désolé, c'est loin de mon système, ne pouvait donc pas ajouter cela à temps.