2014-08-29 5 views
12

Ich bin neu zu verwenden Winkel js und ich habe viele Controller und jetzt möchte ich Benutzerfunktion von einem Controller in einen anderen Controller. Hier ist mein Beispielcode.Funktion von einem anderen Controller Angular Js anrufen

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

Jetzt möchte ich Test2 Funktion in Controller3 aufrufen. Kann jemand helfen .. Danke in Avance ... :)

Antwort

4

Der beste Weg ist schreiben Sie einen Service und nutzen Sie diesen Service in beiden Controllern. finden Sie in der Dokumentation Service documentation

Wenn Sie wirklich Controller-Methode von einem anderen Controller zugreifen möchten dann die unter Option folgen: Emittieren eines Ereignisses auf -umfang:

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

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

Ja Aber ich habe bereits Code mit vielen Controller geschrieben, also muss ich jetzt eine Funktion aufrufen, die in einem anderen Controller ist. – Mayur

+1

Das ist in Ordnung. Sie müssen nur diese allgemeine Funktion zu einem Dienst verschieben und von den erforderlichen Controllern aufrufen. – Seminda

13

Sie können keine Methode von einem Controller rufen innerhalb ein Controller. Sie müssen die Methode extrahieren, einen Dienst erstellen und ihn aufrufen. Dies wird auch den Code voneinander entkoppeln und es mehr prüfbar

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

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

+0

Danke für Hilfe :) – Mayur

0

Der Controller ist ein Konstruktor, wird es eine neue Instanz erstellen, wenn zum Beispiel in einer Richtlinie verwendet.

Sie können immer noch tun, was Sie wollten, vorausgesetzt, dass Ihr Regler im gleichen Umfang ist, gerade tun:

Hinweis sie im gleichen Umfang sein muss könnte noch funktionieren, wenn ein Kind Umfang nicht isoliert ist . Die Definition der Richtlinie:

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

Das sollte funktionieren.

Verwandte Themen