69

I need to call a function in another controller in AngularJS. How can I do this?

Code:

app.controller('One', ['$scope',
    function($scope) {
        $scope.parentmethod = function() {
            // task
        }
    }
]);

app.controller('two', ['$scope',
    function($scope) {
        $scope.childmethod = function() {
            // Here i want to call parentmethod of One controller
        }
    }
]);
3
  • 2
    Put the function in a service, and inject the service in both controllers. Or, if the second controller scope is a child of the first controller scope, call it directly. Commented Apr 6, 2015 at 7:47
  • 1
    This feels like an XY Question to me; While there are a few ways you can call a function on another controller, there are really very few good reasons that you have to do so. Perhaps describing what your actual problem is would be more helpful than asking about the solution you are trying to implement? Calling a function on a different controller isn't really the "angular way" of doing things. Commented Apr 6, 2015 at 7:49
  • is one controller a child/grand-child of the other controller? Or are they unrelated siblings? Commented Apr 6, 2015 at 8:11

6 Answers 6

138

Communication between controllers is done though $emit + $on / $broadcast + $on methods.

So in your case you want to call a method of Controller "One" inside Controller "Two", the correct way to do this is:

app.controller('One', ['$scope', '$rootScope'
    function($scope) {
        $rootScope.$on("CallParentMethod", function(){
           $scope.parentmethod();
        });

        $scope.parentmethod = function() {
            // task
        }
    }
]);
app.controller('two', ['$scope', '$rootScope'
    function($scope) {
        $scope.childmethod = function() {
            $rootScope.$emit("CallParentMethod", {});
        }
    }
]);

While $rootScope.$emit is called, you can send any data as second parameter.

Sign up to request clarification or add additional context in comments.

3 Comments

I am able to call the function just using $rootScope.function_name();
with a minor issue for param passing.. this resolved a big issue of mine. Thanks
we can not pass parameter like this. 1st param is event whereas 2nd is data. like $rootScope.$on("CallParentMethod", function(event,data){{});
29

I wouldn't use function from one controller into another. A better approach would be to move the common function to a service and then inject the service in both controllers.

1 Comment

This is not always possible
11

You may use events to provide your data. Code like that:

app.controller('One', ['$scope', function ($scope) {
         $scope.parentmethod=function(){
                 $scope.$emit('one', res);// res - your data
         }
    }]);
    app.controller('two', ['$scope', function ($scope) {
         $scope.$on('updateMiniBasket', function (event, data) {
                ...
         });             
    }]);

1 Comment

Life saver. There is an answer above , I followed it and it almost worked for me but param was not received. He missed the point that if we want to pass param, we need to do $scope.$on('someMehotdName',function(event,data){});
7

If the two controller is nested in One controller.
Then you can simply call:

$scope.parentmethod();  

Angular will search for parentmethod function starting with current scope and up until it will reach the rootScope.

Comments

5

The best approach for you to communicate between the two controllers is to use events.

See the scope documentation

In this check out $on, $broadcast and $emit.

Comments

2

If you would like to execute the parent controller's parentmethod function inside a child controller, call it:

$scope.$parent.parentmethod();

You can try it over here

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.