it-swarm.com.ru

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

Я продолжаю получать неизвестного поставщика на controllerOne. Я не понимаю, как это возможно, поскольку они сосуществуют в одном модуле. Любая помощь приветствуется.

16
Joseph Freeman

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

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

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

25
Pankaj Parkar

Переместите свою логику в «сервис» (либо фабрика/сервис/провайдер). Я лично предпочитаю фабрики, мне просто нравится управлять своим собственным объектом вместо использования 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() );
}]);

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

Сила услуг :)

3

Если a 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;
}]);

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

1
Matt Lemieux

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

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

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

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

0
Ritesh