web-dev-qa-db-fra.com

Fonction d'appel depuis un autre contrôleur Angular Js

Je suis nouveau à utiliser js angulaire et j'ai déclarer de nombreux contrôleurs et maintenant je veux utiliser la fonction d'un contrôleur dans un autre contrôleur. voici mon exemple de code.

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){
  ///
});

Maintenant, je veux appeler la fonction test2 à l'intérieur de controller3 . Quelqu'un peut-il aider .. Merci dans Avance ... :)

12
Mayur

Vous ne pouvez pas appeler une méthode depuis un contrôleur dans un contrôleur. Vous devrez extraire la méthode, créer un service et l'appeler. Cela va également découpler le code l’un de l’autre et le rendre plus testable

(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();
            }
        ]);
})();

Exemple: http://plnkr.co/edit/FQnthYpxgxAiIJYa69hu?p=preview

13
RSquared

Le meilleur moyen est d'écrire un service et de l'utiliser dans les deux contrôleurs. voir la documentation Documentation de service

Si vous voulez vraiment accéder à la méthode du contrôleur depuis un autre contrôleur, suivez l’option ci-dessous: Émettre un événement dans l’étendue:

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

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

Le contrôleur est un constructeur, il créera une nouvelle instance si, par exemple, il est utilisé dans une directive.

Vous pouvez toujours faire ce que vous vouliez, en supposant que vos contrôleurs soient dans le même champ, faites simplement:

Notez qu'ils doivent être dans la même portée, pourraient toujours fonctionner si une portée enfant n'était pas isolée . La définition de la directive:

{
    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();
    }
}

Cela devrait marcher.

0
Noypi Gilas