Dalam kasus di mana Anda memiliki beberapa arahan pada elemen DOM tunggal dan di mana urutan penerapannya penting, Anda bisa menggunakan priority
properti untuk memesan aplikasi mereka. Angka yang lebih tinggi dijalankan terlebih dahulu. Prioritas default adalah 0 jika Anda tidak menentukan satu.
EDIT : setelah diskusi, inilah solusi lengkap untuk bekerja. Kuncinya adalah untuk menghapus atribut : element.removeAttr("common-things");
, dan juga element.removeAttr("data-common-things");
(dalam kasus pengguna menentukan data-common-things
di html)
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);
}
};
}
};
});
Plunker yang berfungsi tersedia di: http://plnkr.co/edit/Q13bUt?p=preview
Atau:
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
Penjelasan mengapa kita harus mengatur terminal: true
dan priority: 1000
(angka tinggi):
Ketika DOM siap, sudut berjalan DOM untuk mengidentifikasi semua arahan terdaftar dan menyusun arahan satu per satu berdasarkan priority
jika arahan ini berada di elemen yang sama . Kami menetapkan prioritas arahan khusus kami ke angka yang tinggi untuk memastikan bahwa arahan tersebut akan dikompilasi terlebih dahulu dan terminal: true
, arahan lainnya akan dilewati setelah arahan ini dikompilasi.
Ketika arahan khusus kami dikompilasi, itu akan memodifikasi elemen dengan menambahkan arahan dan menghapus sendiri dan menggunakan layanan $ compile untuk mengkompilasi semua arahan (termasuk yang dilewati) .
Jika kami tidak menetapkan terminal:true
dan priority: 1000
, ada kemungkinan beberapa arahan dikompilasi sebelum arahan adat kami. Dan ketika arahan khusus kami menggunakan $ compile untuk mengkompilasi elemen => kompilasi lagi arahan yang sudah dikompilasi. Ini akan menyebabkan perilaku yang tidak dapat diprediksi terutama jika arahan yang dikompilasi sebelum arahan khusus kami telah mengubah DOM.
Untuk informasi lebih lanjut tentang prioritas dan terminal, lihat Bagaimana memahami `terminal` dari direktif?
Contoh dari arahan yang juga memodifikasi template adalah ng-repeat
(priority = 1000), ketika ng-repeat
dikompilasi, ng-repeat
buat salinan dari elemen template sebelum arahan lain diterapkan .
Berkat komentar @ Izhaki, berikut ini adalah referensi ke ngRepeat
kode sumber: https://github.com/angular/angular.js/blob/master/src/ng/directive/ngRepeat.js
RangeError: Maximum call stack size exceeded
seperti yang terus dikompilasi selamanya.