Tek bir DOM öğesinde birden fazla yönerge bulunduğunuz ve uygulanma priority
sırasının önemli olduğu durumlarda, uygulamalarını sipariş etmek için özelliği kullanabilirsiniz . Önce yüksek sayılar çalışır. Birini belirtmezseniz, varsayılan öncelik 0'dır.
EDIT : tartışmadan sonra, işte tam bir çözüm. Anahtar :: özniteliğini kaldırmaktıelement.removeAttr("common-things");
ve ayrıca element.removeAttr("data-common-things");
(kullanıcıların html'de belirtmesi durumunda data-common-things
)
angular.module('app')
.directive('commonThings', function ($compile) {
return {
restrict: 'A',
replace: false,
terminal: true, //this setting is important, see explanation below
priority: 1000, //this setting is important, see explanation below
compile: function compile(element, attrs) {
element.attr('tooltip', '{{dt()}}');
element.attr('tooltip-placement', 'bottom');
element.removeAttr("common-things"); //remove the attribute to avoid indefinite loop
element.removeAttr("data-common-things"); //also remove the same attribute with data- prefix in case users specify data-common-things in the html
return {
pre: function preLink(scope, iElement, iAttrs, controller) { },
post: function postLink(scope, iElement, iAttrs, controller) {
$compile(iElement)(scope);
}
};
}
};
});
Çalışan dalma pistonunu şu adreste bulabilirsiniz: http://plnkr.co/edit/Q13bUt?p=preview
Veya:
angular.module('app')
.directive('commonThings', function ($compile) {
return {
restrict: 'A',
replace: false,
terminal: true,
priority: 1000,
link: function link(scope,element, attrs) {
element.attr('tooltip', '{{dt()}}');
element.attr('tooltip-placement', 'bottom');
element.removeAttr("common-things"); //remove the attribute to avoid indefinite loop
element.removeAttr("data-common-things"); //also remove the same attribute with data- prefix in case users specify data-common-things in the html
$compile(element)(scope);
}
};
});
DEMO
Biz sete neden açıklanması terminal: true
ve priority: 1000
(yüksek sayıda):
DOM hazır olduğunda, açısal, tüm kayıtlı direktifleri tanımlamak ve priority
bu direktiflerin aynı eleman üzerinde olup olmadığına bağlı olarak direktifleri tek tek derlemek için DOM'u yürür . İlk önce derlenmesini sağlamak için özel direktifimizin önceliğini yüksek bir sayıya ayarladık ve bu direktif derlendikten sonra terminal: true
diğer direktifler atlanacaktır .
Özel yönergemiz derlendiğinde, yönergeler ekleyerek ve kendisini kaldırarak öğeyi değiştirir ve tüm yönergeleri (atlananlar dahil) derlemek için $ compile hizmetini kullanır .
Ayarlamazsak terminal:true
ve priority: 1000
bazı direktiflerin özel direktifimizden önce derlenme şansı vardır . Özel yönergemiz, = derlemek için $ compile kullandığında, zaten derlenmiş yönergeleri yeniden derlemektedir. Bu, özellikle özel yönergemizden önce derlenen yönergeler zaten DOM'u dönüştürdüyse öngörülemeyen davranışlara neden olacaktır.
Öncelik ve terminal hakkında daha fazla bilgi için Direktifin “terminali” nasıl anlaşılır?
Şablonu da değiştiren bir yönerge örneği ng-repeat
(öncelik = 1000), ng-repeat
derlendiğinde, ng-repeat
diğer yönergeler uygulanmadan önce şablon öğesinin kopyalarını oluşturun .
@ Izhaki'nin yorumu sayesinde, ngRepeat
kaynak koduna referans : https://github.com/angular/angular.js/blob/master/src/ng/directive/ngRepeat.js
RangeError: Maximum call stack size exceeded
sonsuza kadar derlemeye devam ederken.