Per quanto ho notato, Angular compila le cose in un primo arrivato, base first-service che è piuttosto complicata. Ho creato una direttiva che racchiude alcuni elementi e desidero avere una proprietà link che cerchi elementi nel contenuto.AngularJS modifica l'ordine di quali direttive sono compilate
Per un caso d'uso concreto: Sto facendo una direttiva un'etichetta di ingresso che si affaccia all'interno del contenuto per il primo ingresso e aggiunge un generato in modo casuale id
alla input
e un attributo for
al label
Ecco il codice :
// Find the first element with the attribute ng-label-target or the first input and links a label to it
app.directive('ngLabel', function() {
return {
restrict: 'E',
replace: true,
transclude: true,
scope: {
label: '@',
},
template: '<span class="ng-label">' +
'<label class="ng-label-text">{{label}}</label>' +
'<span class="ng-label-content" ng-transclude></span>' +
'</span>',
link: function (scope, element, attrs) {
scope.id = scope.id || 'random-id-' + Math.floor(Math.random() * 90000000);
angular.element(element[0].querySelector('.ng-label-text')).
attr({for:scope.id});
var target = angular.element(element[0].querySelector('[ng-label-target]'));
if (!target || target.length == 0) {
target = angular.element(element[0].querySelectorAll('input,select,textarea')[0]);
}
target.attr({id:scope.id});
},
};
});
Esempio Uso:
<ng-label label="Text:">
<input type="text" ng-model="page.textColor" size="5" maxlength="7" placeholder="e.g. #000" required />
<input ng-label-target type="color" ng-model="page.textColor" required />
</ng-label>
Questo di per sé funziona come un fascino.
Tuttavia ora voglio generare automaticamente diversi input e l'etichetta punta al primo. Il problema è che quando faccio un ng-repeat
all'interno del mio ng-label
allora il codice ng-repeat
viene generato dopo che la mia direttiva è stata elaborata in modo che nulla venga effettivamente trovato.
Quindi la mia domanda è: c'è un modo in cui è possibile specificare angolare per valutare le direttive nidificate dentro e fuori anziché l'altro?
Oppure, c'è un modo migliore per farlo rispetto a quello che sto facendo attualmente?
Ho fatto un violino per esemplificare l'ordine in cui le cose vengono valutate. Si vede che l'esterno direttiva ha un valore minore o uguale di quello che è il contenuto (non può andare inferiore microsecondi così ho dovuto fare un po 'di ripetizioni):
sembra molto più complicato del necessario ... la demo fornita ha troppa ricorsione, fornisce demo usando la direttiva e il markup. Potresti trovare più semplice il plunker per creare demo angolari rispetto al violino. – charlietfl
Perché l'ID deve essere casuale? Non puoi semplicemente usare 'id =" nome _ {{$ indice}} "' e lo stesso per l'etichetta? –
Non voglio specificare l'ID perché di solito non ne ho bisogno, ecco perché è casuale se non è specificato – Stefan