Функция вызова от другого контроллера Angular Js

Я новичок в использовании angular js, и я объявил много контроллеров, и теперь я хочу, чтобы пользовательская функция одного контроллера была в другом контроллере. вот мой пример кода.

app.controller('Controller1',function($scope,$http,$compile){
    $scope.test1=function($scope)
    {
          alert("test1");
    }
});

app.controller('Controller2',function($scope,$http,$compile){
    $scope.test2=function($scope)
    {
          alert("test1");
    }
});
app.controller('Controller3',function($scope,$http,$compile){
  ///
});

Теперь я хочу вызвать функцию test2 внутри контроллера3. Может кто-нибудь помочь.. Спасибо в Avance...:)

Ответ 1

Вы не можете вызвать метод с контроллера в контроллере. Вам нужно будет извлечь метод, создать службу и вызвать ее. Это также отделит код друг от друга и сделает его более проверяемым.

(function() {
    angular.module('app', [])
        .service('svc', function() {
            var svc = {};

            svc.method = function() {
                alert(1);
            }

            return svc;
        })
        .controller('ctrl', [
            '$scope', 'svc', function($scope, svc) {
                svc.method();
            }
        ]);
})();

Пример: http://plnkr.co/edit/FQnthYpxgxAiIJYa69hu?p=preview

Ответ 2

Лучший способ - написать службу и использовать эту службу в обоих контроллерах. см. документацию Сервисная документация

Если вы действительно хотите получить доступ к методу контроллера с другого контроллера, выполните следующие действия: испускание события по охвату:

function FirstController($scope) {  $scope.$on('someEvent', function(event, args) {});}

function SecondController($scope) {  $scope.$emit('someEvent', args);}

Ответ 3

Контроллер - это конструктор, он создаст новый экземпляр, если, например, используется в директиве.

Вы все равно можете делать то, что хотели, считая, что ваши контроллеры находятся в одной области, просто выполните:

Обратите внимание, что они должны быть в той же области, могут работать, если дочерняя область не изолирована. Определение директивы:

{
    controller: Controller1,
    controllerAs: 'ctrl1',
    link: function($scope) {

        $scope.ctrl1.test1(); // call a method from controller 1
        $scope.ctrl2.test2(); // created by the directive after this definition
        $scope.ctrl3.test3(); // created by the directive after this definition
    }
}

....
{
    controller: Controller2,
    controllerAs: 'ctrl2',
    link: function($scope) {
        $scope.ctrl1.test1(); // created earlier
        $scope.ctrl2.test2(); // ...
        $scope.ctrl3.test3(); // created by the directive after this definition
    }
}

....
{
    controller: Controller3,
    controllerAs: 'ctrl3',
    link: function($scope) {
        $scope.ctrl1.test1();
        $scope.ctrl2.test2();
        $scope.ctrl3.test3();
    }
}

Это должно работать.