O ile wiem, Angular kompiluje rzeczy na zasadzie "kto pierwszy, ten lepszy", co jest trudne. Zrobiłem dyrektywę, która otacza niektóre elementy i chcę mieć właściwość odsyłacza, która szuka rzeczy w treści.AngularJS - kolejność zmian, z której tworzone są dyrektywy
Na betonowym użytkowej przypadku: Robię dyrektywę Oznaczenie wejścia który wygląda wewnątrz zawartości dla pierwszego wejścia i dodaje losowo generowane id
do input
i atrybut do label
Tutaj for
jest kod :
// 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});
},
};
});
Przykład Zastosowanie:
<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>
To samo w sobie działa jak urok.
Jednak teraz chcę automatycznie wygenerować kilka wejść i mieć etykietę wskazującą na pierwszą. Problem polega na tym, że kiedy robię ng-repeat
wewnątrz mojego ng-label
, kod ng-repeat
jest generowany po tym, jak moja dyrektywa została przetworzona, więc nic nie zostanie znalezione.
Dlatego moje pytanie brzmi: czy istnieje sposób, w jaki można określić kątowe, aby ocenić zagnieżdżone dyrektywy na lewą stronę zamiast odwrotnie?
Czy jest na to jakiś sposób, niż robię to obecnie?
Zrobiłem skrzypce, aby zilustrować kolejność oceniania rzeczy. Widać, że zewnętrzna Dyrektywa ma mniejszy lub równy wartości niż to zawartość (nie można zejść niżej niż mikrosekund, więc musiałem zrobić kilka powtórzeń):
z pewnością wygląda o wiele bardziej skomplikowanie niż potrzeba ... dostarczona wersja demo ma zbyt dużą rekurencję, dostarcz wersję demonstracyjną za pomocą dyrektywy i znaczników. Możesz odkryć, że plunker jest łatwiejszy do tworzenia kanciastych wersji demo niż z skrzypcami. – charlietfl
Dlaczego 'id' musi być losowy? Nie możesz po prostu użyć 'id =" name _ {{index}} "" i tego samego dla etykiety? –
Nie chcę określać identyfikatora, ponieważ generalnie go nie potrzebuję, dlatego jest losowy, jeśli nie został określony. – Stefan