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());
}])
Ответы
Ответ 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