Perché non posso richiedere una direttiva figlio da una direttiva sui genitori?
-
20-12-2019 - |
Domanda
Questo plunkr getta questo errore:
Error: [$compile:ctreq] Controller 'childDirective', required by directive 'parentDirective', can't be found!
Posso lavorare intorno a questo, ma sono curioso se questo è by-design, e perché (mono genitore vs più bambini per bambini)?Non vedo alcuna menzione di questa restrizione in $ ng.comPile Docs .
Soluzione
Il motivo per cui ciò non è implementato è le prestazioni.Attraversare il DOM è molto più veloce del controllo di ogni filiale per bambini per una possibile corrispondenza.Per questo motivo il modo consigliato è lasciare che l'elemento figlio informi il loro genitore del loro stato.
Si noti che ciò viene effettuato tramite le istanze dei controller associati, non tramite le direttive.
Ho aggiornato il tuo sorso con un Esempio di funzionamento
angular.module('foo', [])
.directive('parentDirective', function() {
return {
controller: function($scope) {
$scope.childs = {};
this.registerChild = function(child) {
$scope.childs[child.name] = child;
};
},
link: function(scope, element, attrs) {}
};
})
.directive('childDirective', function() {
return {
controller: function($scope) {},
require: ['^parentDirective', 'childDirective'],
link: function($scope, $element, $attrs, $ctrls) {
var parent = $ctrls[0];
var child = $ctrls[1];
child.name = $attrs.childDirective;
parent.registerChild(child);
}
};
});
. Altri suggerimenti
Non è possibile richiedere una direttiva figlio, per quanto non so nulla in Angular lo consente.È possibile richiedere solo una direttiva madre da un bambino, da
require: '^parentDirectiveName'
.
o una direttiva del fratello, di
require: 'siblingDirectiveName'
.
Quindi sì, questo è per progettazione, o almeno una mancanza di funzionalità.