據我注意到,Angular以先到先得的方式編譯了一些東西,這很棘手。我做了一個包裝一些元素的指令,我想要一個鏈接屬性來查找內容中的東西。AngularJS編譯指令的更改順序
對於一個具體的用例:我想提出一個輸入標籤指令,它查找第一個輸入裏面的內容,並增加了一個隨機生成的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-label
內部執行ng-repeat
時,ng-repeat
代碼在處理我的指令後生成,因此沒有找到任何實際的代碼。
因此,我的問題是:有沒有一種方法可以指定角來評估嵌套指令而不是其他方式?
或者,有沒有比我目前這樣做的連擊方式?
我做了一個小提琴來舉例說明評估東西的順序。你看到外指令有一個小於或等於價值超過了它的內容(不能再低於微秒,所以我不得不做了一堆重複的):
肯定看起來比需要複雜得多...演示提供了太多的遞歸,使用您的指令和標記提供演示。你可能會發現更容易創建角度的演示,而不是小提琴 – charlietfl
爲什麼'id'需要是隨機的?你不能只使用'id =「name _ {{$ index}}」'和標籤相同嗎? –
我不想指定ID,因爲我通常不需要它,這就是爲什麼它是隨機的,如果它沒有指定 – Stefan