An nice and easy way to access methods provided by a directive via the directive service. Based on AngularJS 1.4.7
A Pen by Christian Haintz on CodePen.
An nice and easy way to access methods provided by a directive via the directive service. Based on AngularJS 1.4.7
A Pen by Christian Haintz on CodePen.
| <div ng-app="app"> | |
| <div class="container" ng-controller="MainController as main"> | |
| <h1>Accessing methods of AngularJS directive</h1> | |
| <p>An easy example of a common way to call directive methods with a service. Addressing of directives is done by ID's which makes it possible to access the method exposed by the directives even outside of the controller scope.</p> | |
| <div class="row well"> | |
| <button ng-click="main.changeQuote('quote_1')" class="btn btn-primary col-sm-3 col-sm-offset-2"> | |
| Change quote for cncQuote Directive 1 | |
| </button> | |
| <button ng-click="main.changeQuote('quote_2')" class="btn btn-primary col-sm-3 col-sm-offset-2"> | |
| Change quote for cncQuote Directive 2 | |
| </button> | |
| </div> | |
| <div class="row well"> | |
| <h2>Quote Directive 1: <cnc-quote id="quote_1">No Quote</cnc-quote></h2> | |
| </div> | |
| <div class="row well"> | |
| <h2>Quote Directive 2: <cnc-quote id="quote_2">No Quote</cnc-quote></h2> | |
| </div> | |
| <p class="text-muted">Built on 10/2015 by Christian Haintz, Carrot & Company</p> | |
| </div> | |
| </div> |
| angular.module('app', []) | |
| .controller('MainController', MainController) | |
| .service('cncQuoteService', cncQuoteService) | |
| .directive('cncQuote', cncQuote) | |
| .controller('cncQuoteController', cncQuoteController); | |
| function MainController($log, cncQuoteService) { | |
| var self = this; | |
| //methods | |
| self.changeQuote = changeQuote; | |
| function changeQuote(quoteId) { | |
| $log.debug('MainController: Call directive service changeQuote %o', quoteId); | |
| cncQuoteService.changeQuote(quoteId); | |
| } | |
| } | |
| //Directive Service | |
| function cncQuoteService($log) { | |
| var self = this; | |
| //vars | |
| self.quoteDirectives = {}; | |
| //methods | |
| self.registerQuoteDirective = registerQuoteDirective; | |
| self.unregisterQuoteDirective = unregisterQuoteDirective; | |
| self.changeQuote = changeQuote; | |
| function changeQuote(quoteId) { | |
| $log.debug('cncQuoteService: changeQuote %o', quoteId); | |
| if (quoteId) { | |
| self.quoteDirectives[quoteId].changeQuote(); | |
| } | |
| } | |
| function registerQuoteDirective(id, scope) { | |
| self.quoteDirectives[id] = scope; | |
| } | |
| function unregisterQuoteDirective(id) { | |
| delete self.quoteDirectives[id]; | |
| } | |
| } | |
| //Directive | |
| function cncQuote($log) { | |
| var directive = { | |
| restrict: 'E', | |
| bindToController: true, | |
| transclude: true, | |
| link: linkFunction, | |
| controller: 'cncQuoteController', | |
| controllerAs: 'ctrl' | |
| }; | |
| return directive; | |
| function linkFunction(scope, el, attr, ctrl) { | |
| //Init the Directive Controller with el, and attr | |
| $log.debug('cncQuote: linkFunction: attr.id %o', attr.id); | |
| ctrl.init(el, attr); | |
| } | |
| } | |
| //Directive Controller | |
| function cncQuoteController($log, $scope, cncQuoteService) { | |
| var self = this; | |
| //vars | |
| self.el = null; | |
| self.attr = null; | |
| self.index = 0; | |
| self.quotes = [ | |
| 'This rocks!', | |
| 'I like it!', | |
| 'Angular rocks!', | |
| 'What a day!' | |
| ] | |
| //methods | |
| self.init = init; | |
| self.changeQuote = changeQuote; | |
| function init(el, attr) { | |
| self.el = el; | |
| self.attr = attr; | |
| $log.debug('cncQuoteController: Init and register id %o', attr.id); | |
| cncQuoteService.registerQuoteDirective(attr.id, self); | |
| //on ctrl destroy, also unregister from service | |
| $scope.$on("$destroy", function() { | |
| cncQuoteService.unregisterQuoteDirective(attr.id); | |
| }); | |
| } | |
| function changeQuote() { | |
| (self.index === self.quotes.length - 1) ? self.index = 0: self.index++; | |
| var newText = self.quotes[self.index]; | |
| $log.debug('cncQuoteController: Change quote for id %o with text %o', self.attr.id, newText); | |
| self.el.html(newText); | |
| } | |
| } |
| <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js"></script> |
| <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" /> |