I am using angular 1.5 component and need to call function in parent controller from when $emit in child component. How we can do this?
Example:
(function (angular) {
'use strict';
controllerName.$inject = [];
function controllerName() {
var _this = this;
function toBeCalledOnEmit() {//some code}
var vm = {
toBeCalledOnEmit: toBeCalledOnEmit
}
angular.extend(_this, vm);
}
angular.module('moduleName', [
]).component('parentComponenet', {
templateUrl: 'templateUrl',
controller: 'controllerName'
}).controller('controllerName', controllerName);
})(angular);
child component:
(function (angular) {
'use strict';
childController.$inject = [];
function childController() {
//needs $emit here
}
angular.module('childModuleName', [
]).component('childComponent', {
templateUrl: 'templateUrl',
controller: 'childController'
}).controller('childController', childController);
})(angular);
$emit() allows you to raise an event in your AngularJS application. It sends an event upwards from the current controller to all of its parent controllers.
The difference between $broadcast and $emit is that the former sends the event downwards from parent to child controllers, while $emit sends an event upwards from the current controller to all of its parent controllers. Both methods are available on $scope and $rootScope.
Broadcast: We can pass the value from parent to child (i.e parent -> child controller.) Emit: we can pass the value from child to parent (i.e.child ->parent controller.) On: catch the event dispatched by $broadcast or $emit .
As you can see, the service object uses $rootScope. $emit() to announce interval events and the directive uses $rootScope. $on() to listen for those events.
I prefer working with a separate event service that exposes subscribe and notify functions. But if you prefer to emit from the child component then it would look like this:
(function (angular) {
'use strict';
function childController($scope) {
$scope.$emit("someEvent", args);
}
angular.module('childModuleName', [
]).component('childComponent', {
templateUrl: 'templateUrl',
controller: ['$scope', childController]
});
})(angular);
(function (angular) {
'use strict';
function controllerName($scope) {
var _this = this;
function toBeCalledOnEmit(event, args) {
//some code
}
$scope.on('someEvent', toBeCalledOnEmit);
var vm = {
toBeCalledOnEmit: toBeCalledOnEmit
}
angular.extend(_this, vm);
}
angular.module('moduleName', [
]).component('parentComponent', {
templateUrl: 'templateUrl',
controller: ['$scope', controllerName]
});
})(angular);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With