Насколько я заметил, Angular компилирует вещи на основе первого, первого порядка, что довольно сложно. Я сделал директиву, которая обертывает некоторые элементы, и я хочу иметь свойство ссылки, которое ищет материал в контенте.
В конкретном случае использования: я делаю директиву метки ввода, которая просматривает содержимое для первого ввода и добавляет случайно сгенерированный id
в атрибут input
и for
к label
Здесь код:
// 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});
},
};
});
Пример использования:
<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>
Это само по себе работает как шарм.
Однако теперь я хочу автоматически генерировать несколько входов и указывать метку на первую. Проблема в том, что когда я делаю ng-repeat
внутри моего ng-label
, тогда код ng-repeat
генерируется после того, как моя директива была обработана, поэтому ничего не найдено.
Поэтому мой вопрос: есть ли способ, которым вы можете указать Angular для оценки вложенных директив наизнанку, а не наоборот?
Или, есть ли способ сделать это, чем я сейчас делаю?
Я сделал скрипку, чтобы продемонстрировать порядок, в котором материал оценивается. Вы видите, что внешняя директива имеет меньшее или равное значение, чем содержимое (не может идти ниже микросекунд, поэтому мне пришлось сделать кучу повторов):