2014-08-29 87 views
12

我是使用角度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){ 
    /// 
}); 

現在我想調用controller3內的test2函數。 任何人都可以幫助.. 感謝Avance ... :)

回答

4

最好的方法是編寫一個服務並在兩個控制器中使用該服務。看到文檔Service documentation

如果你真的想從另一個控制器訪問控制方法,然後按照下面的選項: 範圍上發光的事件:

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

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

是的但我已經寫了很多控制器的代碼,所以現在我必須調用另一個控制器中的一個函數。 – Mayur 2014-08-29 06:48:10

+1

這很好。只有您需要的是將該通用功能移至某個服務並從所需的控制器調用該服務。 – Seminda 2014-08-29 07:01:30

13

你不能在從控制器調用的方法一個控制器。您需要提取方法,創建服務並調用它。這也將彼此分離的代碼,並使其更容易測試

(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

+0

感謝您的幫助:) – Mayur 2014-08-29 07:06:50

0

控制器是一個構造中,如果例如在一個指令中使用其將創建一個新的實例。

你仍然可以做你想要的,假設你的控制器在同一範圍內,只是做:

注意,他們必須在同一範圍,仍然可以工作,如果一個孩子的範圍不是孤立。 該指令的定義:

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

這應該工作。