Существует способ избежать использования $scope
для доступа родительского контроллера, но вы должны использовать link
функция. документация ANGULAR в says:
Требовать
Требовать другую директиву и ввести свой контроллер в качестве четвертого аргумента функции связующей ...
Вариант 1
С controllerAs
creat es в scope
вашего контроллера, вы можете получить доступ к этому пространству имен внутри своей функции link
и поставить контроллер на контроллер childDirective
вместо $scope
. Тогда код будет выглядеть так.
angular.module('app', []).
controller('parentController', function() {
this.doSomething = function() {
alert('parent');
};
}).
controller('childController', function() {
this.click = function() {
this.parentDirectiveCtrl.doSomething();
}
}).
directive('parentDirective', function() {
return {
controller: 'parentController'
}
}).
directive('childDirective', function() {
return {
template: '<button ng-click="controller.click()">Click me</button>',
link: function link(scope, element, attrs, parentDirectiveCtrl) {
scope.controller.parentDirectiveCtrl = parentDirectiveCtrl;
},
controller: 'childController',
controllerAs: 'controller',
bindToController: true,
require: '^parentDirective'
}
});
Plunker:
http://plnkr.co/edit/YwakJATaeuvUV2RBDTGr?p=preview
Вариант 2
Я обычно не используют контроллеры в своих директивах на всех и поделиться функциональность с помощью услуг. Если вам не нужно взаимодействовать с изолированными областями родительских и дочерних директив, просто добавьте одну и ту же услугу к обоим из них и включите все функциональные возможности для обслуживания.
angular.module('app', []).
service('srv', function() {
this.value = '';
this.doSomething = function(source) {
this.value = source;
}
}).
directive('parentDirective', ['srv', function(srv) {
return {
template: '<div>' +
'<span ng-click="srv.doSomething(\'parent\')">Parent {{srv.value}}</span>' +
'<span ng-transclude></span>' +
'</div>',
transclude: true,
link: function(scope) { scope.srv = srv; }
};
}]).
directive('childDirective', ['srv', function(srv) {
return {
template: '<button ng-click="srv.doSomething(\'child\')">Click me</button>',
link: function link(scope) { scope.srv = srv; }
}
}]);
Plunker
http://plnkr.co/edit/R4zrXz2DBzyOuhugRU5U?p=preview
Вы не должны передать его через рамки - вы можете просто присвоить его ваш собственный контроллер ... но в остальном, да - вам нужна функция связи –
Как вы это понимаете, назначив ее? – thatmarvin
Вам нужен как ваш собственный контроллер, так и родительский ... 'require: [" fooDirective ","^parentDirective "]' ... и присваивать один другому ... но для него все равно потребуется функция ссылки - которая где вводятся требуемые контроллеры. –