Apa lagi yang terjadi antara pemanggilan fungsi ini?
Berbagai fungsi direktif dijalankan dari dalam dua fungsi sudut lain yang disebut $compile
(di mana direktif compile
dijalankan) dan fungsi internal disebut nodeLinkFn
(di mana direktif controller
, preLink
dan postLink
dijalankan). Berbagai hal terjadi dalam fungsi sudut sebelum dan sesudah fungsi direktif dipanggil. Mungkin yang paling menonjol adalah rekursi anak. Ilustrasi sederhana berikut ini menunjukkan langkah-langkah utama dalam fase kompilasi dan tautan:
Untuk mendemonstrasikan langkah-langkah ini, mari gunakan markup HTML berikut:
<div ng-repeat="i in [0,1,2]">
<my-element>
<div>Inner content</div>
</my-element>
</div>
Dengan arahan berikut:
myApp.directive( 'myElement', function() {
return {
restrict: 'EA',
transclude: true,
template: '<div>{{label}}<div ng-transclude></div></div>'
}
});
Menyusun
The compile
API terlihat seperti begitu:
compile: function compile( tElement, tAttributes ) { ... }
Seringkali parameter diawali dengan t
untuk menandakan elemen dan atribut yang disediakan adalah orang-orang dari templat sumber, bukan dari contoh.
Sebelum panggilan ke compile
konten yang ditransklusikan (jika ada) dihapus, dan templat diterapkan ke markup. Dengan demikian, elemen yang disediakan untuk compile
fungsi akan terlihat seperti ini:
<my-element>
<div>
"{{label}}"
<div ng-transclude></div>
</div>
</my-element>
Perhatikan bahwa konten yang ditransklusikan tidak dimasukkan kembali pada saat ini.
Mengikuti panggilan ke arahan .compile
, Angular akan melintasi semua elemen anak, termasuk yang mungkin baru saja diperkenalkan oleh arahan (elemen template, misalnya).
Pembuatan instance
Dalam kasus kami, tiga contoh templat sumber di atas akan dibuat (oleh ng-repeat
). Dengan demikian, urutan berikut akan dieksekusi tiga kali, sekali per instance.
Pengendali
The controller
API melibatkan:
controller: function( $scope, $element, $attrs, $transclude ) { ... }
Memasuki fase tautan, fungsi tautan yang dikembalikan via $compile
sekarang disediakan dengan cakupan.
Pertama, fungsi tautan membuat lingkup anak ( scope: true
) atau lingkup terisolasi ( scope: {...}
) jika diminta.
Kontroler kemudian dieksekusi, disediakan dengan cakupan elemen instance.
Pra-tautan
The pre-link
API terlihat seperti begitu:
function preLink( scope, element, attributes, controller ) { ... }
Sebenarnya tidak ada yang terjadi antara panggilan ke direktif .controller
dan .preLink
fungsi. Angular masih memberikan rekomendasi bagaimana masing-masing harus digunakan.
Setelah .preLink
panggilan, fungsi tautan akan melintasi setiap elemen anak - memanggil fungsi tautan yang benar dan melampirkan padanya lingkup saat ini (yang berfungsi sebagai lingkup induk untuk elemen anak).
Posting-tautan
The post-link
API mirip dengan yang dari pre-link
fungsi:
function postLink( scope, element, attributes, controller ) { ... }
Mungkin perlu diperhatikan bahwa sekali .postLink
fungsi direktif dipanggil, proses penghubung semua elemen anak-anaknya telah selesai, termasuk semua fungsi anak-anak .postLink
.
Ini berarti bahwa pada saat .postLink
dipanggil, anak-anak sudah 'hidup' sudah siap. Ini termasuk:
- pengikatan data
- transklusi diterapkan
- ruang lingkup terlampir
Template pada tahap ini akan terlihat seperti ini:
<my-element>
<div class="ng-binding">
"{{label}}"
<div ng-transclude>
<div class="ng-scope">Inner content</div>
</div>
</div>
</my-element>