AngularJS:从同一模块中的另一个控制器内部注入控制器

时间:2015-04-28 18:08:17

标签: javascript angularjs dependency-injection angularjs-scope angularjs-controller

是否可以将控制器注入另一个属于同一模块的控制器?

示例:



var app = angular.module('myAppModule', [])
.controller('controllerOne', ['$scope', function($scope){
  $scope.helloWorld = function(){
    return 'Hello World';
  }
}])
.controller('controllerTwo', ['$scope', 'controllerOne', function($scope, controllerOne){
  console.log(controllerOne.helloWorld());
}])




我一直在controllerOne上获得未知的提供者。我不知道这是可能的,因为它们在同一个模块中共存。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:25)

你需要使用$controller依赖关系,你可以将一个控制器注入另一个

.controller('controllerTwo', ['$scope', '$controller', function($scope, $controller){
  $controller('controllerOne', {$scope: $scope})
  //inside scope you the controllerOne scope will available
}]);

但确实更喜欢service/factory分享数据

答案 1 :(得分:3)

将您的逻辑转移到"服务" (工厂/服务/提供商)。我个人更喜欢工厂,我喜欢控制自己的对象,而不是使用this或类似的其他选项。

使用服务,您可以从控制器中抽象业务逻辑,并使逻辑 - 可重用 - !

var app = angular.module('myAppModule', [])

// typically people use the word Service at the end of the name 
// even if it's a factory (it's all the same thing really...

.factory('sharedService', function () {

    var methods = {};

    methods.helloWorld = function () {
        return 'Hello World!';
    };

    // whatever methods/properties you have within this methods object
    // will be available to be called anywhere sharedService is injected.

    return methods;
})
  

注意 sharedService 已注入

.controller('ControllerOne', ['$scope', 'sharedService', function($scope, sharedService) {
    $scope.helloWorld = sharedService.helloWorld();
}])

// Notice sharedService is injected here as well
.controller('ControllerTwo', ['$scope', 'sharedService', function($scope, sharedService){

    // Now we can access it here too!
    console.log( sharedService.helloWorld() );
}]);
  

旁注:控制器应大写以显示其重要性!

服务的力量:))

答案 2 :(得分:1)

如果一个controllerTwo需要调用与controllerOne相同的功能,你可能想要创建一个服务来处理它。 Angular Services - 通过依赖注入可以在整个程序中访问它们。

var app = angular.module('myAppModule', [])
.controller('controllerOne', ['$scope', 'Hello', function($scope, Hello){
   console.log(Hello.helloWorld() + ' controller one');
}])
.controller('controllerTwo', ['$scope', 'Hello', function($scope, Hello){
   console.log(Hello.helloWorld() + ' controller two');
}])
.factory('Hello', [function() {
   var data = {
      'helloWorld': function() {
          return 'Hello World';
       }
   }

   return data;
}]);

希望这有帮助!

答案 3 :(得分:0)

您无法在其他控制器中注入控制器,只有 serviceProviers 可注入。这就是您在控制器1中作为未知提供程序出错的原因。

使用服务代替并将它们注入控制器,如果有一些功能可以在控制器之间共享。服务是在控制器之间共享数据的最佳方式。

您可以在 $ rootScope 上声明变量或函数或说明对象,它在您的整个应用程序中都存在。

Share data between AngularJS controllers