Якщо ви маєте намір отримати вже створений контролер іншого компонента, і якщо ви дотримуєтесь підходу, заснованого на компонентах / директивах, ви завжди require
можете контролер (екземпляр компонента) з іншого компонента, який дотримується певної ієрархії.
Наприклад:
//some container component that provides a wizard and transcludes the page components displayed in a wizard
myModule.component('wizardContainer', {
...,
controller : function WizardController() {
this.disableNext = function() {
//disable next step... some implementation to disable the next button hosted by the wizard
}
},
...
});
//some child component
myModule.component('onboardingStep', {
...,
controller : function OnboadingStepController(){
this.$onInit = function() {
//.... you can access this.container.disableNext() function
}
this.onChange = function(val) {
//..say some value has been changed and it is not valid i do not want wizard to enable next button so i call container's disable method i.e
if(notIsValid(val)){
this.container.disableNext();
}
}
},
...,
require : {
container: '^^wizardContainer' //Require a wizard component's controller which exist in its parent hierarchy.
},
...
});
Тепер використання цих компонентів може бути приблизно таким:
<wizard-container ....>
<!--some stuff-->
...
<!-- some where there is this page that displays initial step via child component -->
<on-boarding-step ...>
<!--- some stuff-->
</on-boarding-step>
...
<!--some stuff-->
</wizard-container>
Є багато способів , які можна запрограмувати потрібно .
(без префікса) - знайдіть необхідний контролер на поточному елементі. Видаліть помилку, якщо не знайдено.
? - Спроба знайти необхідний контролер або передати null за посиланням fn, якщо не знайдено.
^ - Знайдіть необхідний контролер, здійснивши пошук елемента та його батьків. Видаліть помилку, якщо не знайдено.
^^ - Знайдіть необхідний контролер, здійснивши пошук у батьків елемента. Видаліть помилку, якщо не знайдено.
? ^ - Спроба знайти необхідний контролер шляхом пошуку елемента та його батьків або передати null за посиланням fn, якщо не знайдено.
? ^^ - Спроба знайти необхідний контролер шляхом пошуку батьків елемента, або передати null за посиланням fn, якщо не знайдено.
Стара відповідь:
Вам потрібно ввести $controller
службу введення, щоб створити екземпляр контролера всередині іншого контролера. Але майте на увазі, що це може призвести до деяких проблем з дизайном. Ви завжди можете створити багаторазові служби, які відповідають єдиній відповідальності, і ввести їх у контролери, як вам потрібно.
Приклад:
app.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $scope.$new(); //You need to supply a scope while instantiating.
//Provide the scope, you can also do $scope.$new(true) in order to create an isolated scope.
//In this case it is the child scope of this scope.
$controller('TestCtrl1',{$scope : testCtrl1ViewModel });
testCtrl1ViewModel.myMethod(); //And call the method on the newScope.
}]);
У будь-якому випадку ви не можете зателефонувати, TestCtrl1.myMethod()
оскільки ви приєднали метод $scope
до екземпляра контролера, а не до нього.
Якщо ви спільно використовуєте контролер, то завжди було б краще зробити: -
.controller('TestCtrl1', ['$log', function ($log) {
this.myMethod = function () {
$log.debug("TestCtrl1 - myMethod");
}
}]);
і під час споживання робіть:
.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $controller('TestCtrl1');
testCtrl1ViewModel.myMethod();
}]);
У першому випадку це насправді $scope
ваша модель подання, а у другому випадку це сам екземпляр контролера.
TestCtrl1
замість цього вам слід перевтілитися у послугу.