ในกรณีที่คุณมีคำสั่งหลายคำสั่งในองค์ประกอบ DOM เดียวและตำแหน่งที่คำสั่งนั้นใช้กับคุณสามารถใช้priority
คุณสมบัติเพื่อสั่งซื้อแอปพลิเคชันของพวกเขาได้ ตัวเลขที่สูงกว่าจะรันก่อน ระดับความสำคัญเริ่มต้นคือ 0 หากคุณไม่ได้ระบุไว้
แก้ไข : หลังจากการอภิปรายนี่เป็นวิธีการทำงานที่สมบูรณ์ กุญแจสำคัญคือการลบคุณลักษณะ : element.removeAttr("common-things");
และยังelement.removeAttr("data-common-things");
(ในกรณีที่ผู้ใช้ระบุdata-common-things
ใน 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);
}
};
}
};
});
ปังเกอร์ทำงานได้ที่: http://plnkr.co/edit/Q13bUt?p=preview
หรือ:
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);
}
};
});
การสาธิต
คำอธิบายว่าทำไมเราต้องตั้งค่าterminal: true
และpriority: 1000
(จำนวนสูง):
เมื่อ DOM พร้อมแล้ว Angular จะเดิน DOM เพื่อระบุคำสั่งที่ลงทะเบียนทั้งหมดและคอมไพล์คำสั่งทีละรายการโดยขึ้นอยู่กับpriority
ว่าคำสั่งเหล่านี้อยู่ในองค์ประกอบเดียวกันหรือไม่ เรากำหนดลำดับความสำคัญของคำสั่งที่กำหนดเองของเราเป็นจำนวนสูงเพื่อให้แน่ใจว่ามันจะถูกรวบรวมก่อนและด้วยterminal: true
คำสั่งอื่น ๆ จะถูกข้ามหลังจากคำสั่งนี้ถูกรวบรวม
เมื่อสั่งของเราเองจะรวบรวมก็จะปรับเปลี่ยนองค์ประกอบโดยการเพิ่มคำสั่งและลบตัวเองและใช้บริการ $ รวบรวมเพื่อรวบรวมคำสั่งทั้งหมด (รวมทั้งผู้ที่ถูกข้าม)
หากเราไม่ได้ตั้งค่าterminal:true
และpriority: 1000
มีโอกาสที่จะมีการรวบรวมคำสั่งบางอย่างก่อนคำสั่งที่กำหนดเองของเรา และเมื่อคำสั่งที่กำหนดเองของเราใช้การรวบรวม $ เพื่อรวบรวมองค์ประกอบ => รวบรวมอีกครั้งคำสั่งที่รวบรวมแล้ว สิ่งนี้จะทำให้เกิดพฤติกรรมที่คาดเดาไม่ได้โดยเฉพาะอย่างยิ่งหากคำสั่งที่รวบรวมไว้ก่อนคำสั่งที่กำหนดเองของเราเปลี่ยน DOM แล้ว
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับลำดับความสำคัญและเทอร์มินัลดูที่วิธีการทำความเข้าใจคำสั่งเทอร์มินัล
ตัวอย่างของคำสั่งที่ยังปรับเปลี่ยนแม่แบบคือng-repeat
(priority = 1000) เมื่อng-repeat
จะรวบรวมng-repeat
สำเนาขององค์ประกอบที่ทำให้แม่แบบก่อนที่จะสั่งอื่น ๆ ที่ได้รับมาประยุกต์ใช้
ขอบคุณที่ความคิดเห็นของ @ Izhaki นี่คือการอ้างอิงถึงngRepeat
รหัสแหล่งที่มา: https://github.com/angular/angular.js/blob/master/src/ng/directive/ngRepeat.js
RangeError: Maximum call stack size exceeded
เพราะมันจะรวบรวมตลอดไป