AngularJS:从相同的模块的另一控制器内注入控制器

问题描述 投票:16回答:4

可以控制器注入另一个控制器是同一模块的一部分?

例:

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未知的供应商。我看不到,因为它们在同一模块中共存那怎么可能。任何帮助将非常感激。

javascript angularjs dependency-injection angularjs-scope angularjs-controller
4个回答
25
投票

你需要通过使用$controller依赖,你可以注入一个控制器到另一个

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

但喜欢service/factory共享数据


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

附注:控制器,予以资本化,以显示其重要性!

服务的力量:)


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

希望这可以帮助!


0
投票

你不能在另一个控制器注入控制器,只有serviceProviers是injectable.That是你在控制器的一个越来越误差未知供应商的原因。

利用服务来代替,注入他们的控制器,如果有一些来controllers.Services之间共享功能在控制器之间共享数据的最佳方式。

您可以在$ rootScope声明一个变量或函数或者说对象,它存在于你的整个应用程序。

Share data between AngularJS controllers

© www.soinside.com 2019 - 2024. All rights reserved.