angularjs - How to trigger an event in one view from a different view? -
i trying open angular accordian in header.html
clicking button in body.html
. triggering event in 1 view different view. have idea how in angular?
what can using events let accordion directive know happend or use shared service. considering performance, not make huge difference, if use $emit
instead of $broadcast
since event fired via $emit
bubbles scope hierarchy , $broadcast
sends event down. make sure fire event on $rootscope
, won't event bubble anymore.
so in case want use events have method on component fires event via $emit
on $rootscope
follows:
function openaccordion() { $rootscope.$emit('on-accordion-open', null); }
you use in view, e.g. in body.html
. remember function above part of directive / component or controller.
<button ng-click="vm.openaccordion()">open accordion</button>
also note assume using controlleras
syntax (set vm
).
in accordion directive can hook listeners several events example on-accordion-open
:
$rootscope.$on('on-accordion-open', function() { // open accordion });
the other soltuion use shared service. in case create accordionservce
aware of instances of accordions. service this:
angular.module('myapp').service('accordionservice', function() { var accordions = {}; this.addaccordion = function(name, accordion) { accordions[name] = accordion; }; this.removeaccordion = function(name) { delete accordions[name]; }; this.getaccordion = function(name) { return accordions[name]; }; });
in accordion's controller add accordion accordionservice
via
accordionservice.addaccordion('myaccordion', this);
the this
in snippet above refering accordion controller. thats important because if accordion in component in body.html
, you'll controller instance , can call methods open
.
so in body component can inject accordionservice
, accordion call method:
accordionservice.getaccordion('myaccordion').open();
make sure define open
on accordion's controller.
Comments
Post a Comment