Подтвердить что ты не робот

AngularJS: встроенный контроллер внутри другого контроллера из того же модуля

Можно ли добавить контроллер в другой контроллер, который отличается от того же модуля?

Пример:

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

Ответ 1

Вам нужно использовать зависимость $controller, используя тот, что вы можете добавить один контроллер к другому

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

Но предпочитайте service/factory делиться данными

Ответ 2

Переместите вашу логику в "службу" (либо factory/service/provider). Я лично предпочитаю фабрики, мне просто нравится управлять своим собственным объектом, а не использовать this или что-то подобное с другими параметрами.

Используя сервис, вы даете себе возможность абстрагировать бизнес-логику от ваших контроллеров и сделать эту логику - многоразовой -!

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

// typically people use the word Service at the end of the name 
// even if it a factory (it 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() );
}]);

Боковое примечание: контроллеры должны быть заглавными, чтобы показать их значимость!

Сила услуг:)

Ответ 3

Если контроллеру необходимо вызвать ту же функцию, что и controllerOne, вам может понадобиться создать службу для ее обработки. Angular Сервисы - они доступны во всей вашей программе посредством инъекции зависимостей.

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

Надеюсь, это поможет!

Ответ 4

Вы не можете вводить контроллеры в другие контроллеры, только serviceProviers для инъекций. Это причина, по которой вы получаете ошибку, как неизвестный поставщик в контроллере.

Используйте Службы вместо этого и вводите их в контроллеры, если есть некоторые функции, которые должны использоваться совместно с контроллерами. Службы - лучший способ обмена данными между контроллерами.

Вы можете объявить переменную или функцию или сказать объект на $rootScope, он существует во всем приложении.

Обмен данными между контроллерами AngularJS