Я не могу получить доступ к контроллеру родительской директивы только из одного вложенного. Однако доступ к родительскому контроллеру работает, когда ngIf
используется вместе с вложенной директивой. Я хотел бы знать, какие изменения вносятся ngIf
, чтобы иметь возможность получить доступ к родительскому контроллеру без него.пытается получить доступ к родительскому контроллеру той же директивы
Директива выглядит следующим образом:
angular.module("myApp", [])
.directive("some", function() {
return {
restrict: 'A',
require: ['?^some', '?^^some'],
link: function(scope, element, attrs, parentCtrls) {
attrs.$observe("some", function(someValue) {
scope.someName = someValue;
scope.parentCtrls = parentCtrls
console.log(someValue + " ctrls: " + parentCtrls);
});
},
controller: function($scope) {
this.toString = function() { return $scope.someName }
}
}
});
и код, где вложенные элементы могут быть произвольной глубины:
<html ng-app="myApp">
<head><!-- proper init here --></head>
<body>
<div some="outer">
outer parent ctrls: {{parentCtrls.toString()}}
<div>
<div some="nested1">nested1 parent ctrls: {{parentCtrls.toString()}}</div>
<div some="nested2" ng-if="true">nested2 parent ctrls: {{parentCtrls.toString()}}</div>
</div>
</div>
</body>
</html>
Эффект, который ?^somoe
всегда решает самостоятельно контроллер (который объясняется, например, here) и ?^^some
разрешает родительский контроллер только для nested2
. Его можно проверить на plunker (проверено на угловых 1.3.15 и 1.4.7). ПРИМЕЧАНИЕ: приведенный выше пример на самом деле неверен (в ближайшее время я попытаюсь обновить пример) из-за того, что область разделяется outer
и nested1
. Тем не менее проблема существует в более сложном случае, и принятый ответ правильно перехватил ее.
EDIT
Принято ответ был достаточно для меня, чтобы выяснить нужный путь. Угловой ищет контроллер родительской директивы, вызывая element.parent().inheritedData('$' + name + 'Controller')
. Поэтому вместо ?^^some
я могу использовать element.parent().inheritedData('$someController')
для доступа к требуемому родительскому контроллеру.
Это коротко и точно. Хотя на самом деле мне было интересно, как можно получить доступ к родительскому контроллеру в любом случае, ваш ответ помог мне быстро найти желаемое решение. Благодаря! – ciekawy