Saat menulis arahan Angular, seseorang dapat menggunakan salah satu dari fungsi berikut untuk memanipulasi perilaku DOM, konten dan tampilan elemen di mana arahan dinyatakan:
- menyusun
- pengontrol
- pra-tautan
- posting-tautan
Tampaknya ada beberapa kebingungan mengenai fungsi mana yang harus digunakan. Pertanyaan ini meliputi:
Dasar-dasar arahan
- Bagaimana cara mendeklarasikan berbagai fungsi?
- Apa perbedaan antara templat sumber dan templat contoh ?
- Dalam urutan mana fungsi direktif dijalankan?
- Apa lagi yang terjadi antara pemanggilan fungsi ini?
Berfungsi alam, lakukan dan jangan
Pertanyaan-pertanyaan Terkait:
- Arahan: tautan vs kompilasi vs pengontrol .
- Perbedaan antara fungsi 'controller', 'link' dan 'compile' saat mendefinisikan arahan angular.js .
- Apa perbedaan antara fungsi kompilasi dan tautan di angularjs .
- Perbedaan antara elemen pra-kompilasi dan pasca-kompilasi dalam arahan AngularJS? .
- Angular JS Directive - Templat, kompilasi atau tautan? .
- post link vs pre link dalam arahan js Angular .
angularjs
angularjs-directive
Izhaki
sumber
sumber
Jawaban:
Dalam urutan mana fungsi direktif dijalankan?
Untuk arahan tunggal
Berdasarkan plunk berikut , pertimbangkan markup HTML berikut:
Dengan deklarasi direktif berikut:
Output konsol adalah:
Kita dapat melihat bahwa
compile
dieksekusi terlebih dahulu, lalucontroller
, lalupre-link
dan terakhirpost-link
.Untuk arahan bersarang
Markup HTML asli sering dibuat dari elemen bersarang, masing-masing dengan arahannya sendiri. Seperti di markup berikut (lihat plunk ):
Output konsol akan terlihat seperti ini:
Kita dapat membedakan dua fase di sini - fase kompilasi dan fase tautan .
Fase kompilasi
Ketika DOM dimuat, Angular memulai fase kompilasi, di mana ia melintasi markup top-down, dan memanggil
compile
semua arahan. Secara grafis, kita dapat mengekspresikannya seperti ini:Mungkin penting untuk menyebutkan bahwa pada tahap ini, templat yang didapat fungsi kompilasi adalah templat sumber (bukan templat contoh).
Fase tautan
Contoh DOM seringkali hanya hasil dari templat sumber yang diberikan ke DOM, tetapi mereka dapat dibuat oleh
ng-repeat
, atau diperkenalkan dengan cepat.Setiap kali instance baru elemen dengan arahan diberikan ke DOM, fase tautan dimulai.
Dalam fase ini, Angular memanggil
controller
,,pre-link
mengulangi anak-anak, dan memanggilpost-link
semua arahan, seperti:sumber
Apa lagi yang terjadi antara pemanggilan fungsi ini?
Berbagai fungsi direktif dijalankan dari dalam dua fungsi sudut lain yang disebut
$compile
(di mana direktifcompile
dijalankan) dan fungsi internal disebutnodeLinkFn
(di mana direktifcontroller
,preLink
danpostLink
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:
Dengan arahan berikut:
Menyusun
The
compile
API terlihat seperti begitu: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 untukcompile
fungsi akan terlihat seperti ini: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: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: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 daripre-link
fungsi: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:Template pada tahap ini akan terlihat seperti ini:
sumber
Bagaimana cara mendeklarasikan berbagai fungsi?
Kompilasi, Pengontrol, Pra-tautan & Pasca-tautan
Jika seseorang ingin menggunakan keempat fungsi, arahan akan mengikuti formulir ini:
Perhatikan bahwa kompilasi mengembalikan objek yang berisi fungsi pre-link dan post-link; dalam istilah Angular kita mengatakan fungsi kompilasi mengembalikan fungsi templat .
Kompilasi, Kontroler & Tautan-posting
Jika
pre-link
tidak diperlukan, fungsi kompilasi dapat dengan mudah mengembalikan fungsi post-link alih-alih objek definisi, seperti:Terkadang, seseorang ingin menambahkan
compile
metode, setelah metode (posting)link
ditentukan. Untuk ini, seseorang dapat menggunakan:Controller & Post-link
Jika tidak ada fungsi kompilasi yang diperlukan, seseorang dapat melewatkan deklarasi sama sekali dan menyediakan fungsi post-link di bawah
link
properti objek konfigurasi direktif:Tidak ada pengontrol
Dalam salah satu contoh di atas, seseorang dapat dengan mudah menghapus
controller
fungsi jika tidak diperlukan. Jadi misalnya, jika hanyapost-link
fungsi yang diperlukan, seseorang dapat menggunakan:sumber
Apa perbedaan antara templat sumber dan templat contoh ?
Fakta bahwa Angular memungkinkan manipulasi DOM berarti bahwa markup input ke dalam proses kompilasi terkadang berbeda dari output. Khususnya, beberapa markup input dapat dikloning beberapa kali (seperti dengan
ng-repeat
) sebelum diberikan ke DOM.Terminologi sudut agak tidak konsisten, tetapi masih membedakan antara dua jenis markup:
Markup berikut menunjukkan ini:
Sumber html mendefinisikan
yang berfungsi sebagai templat sumber.
Tetapi karena dibungkus dalam suatu
ng-repeat
arahan, templat sumber ini akan dikloning (3 kali dalam kasus kami). Klon ini adalah contoh template, masing-masing akan muncul di DOM dan terikat ke ruang lingkup yang relevan.sumber
Kompilasi fungsi
compile
Fungsi masing-masing direktif hanya dipanggil sekali, saat Angular bootstraps.Secara resmi, ini adalah tempat untuk melakukan manipulasi template (sumber) yang tidak melibatkan lingkup atau pengikatan data.
Terutama, ini dilakukan untuk keperluan optimasi; pertimbangkan markup berikut:
The
<my-raw>
direktif akan membuat satu set tertentu DOM markup. Jadi kita bisa:ng-repeat
untuk menduplikasi templat sumber (<my-raw>
), dan kemudian memodifikasi markup setiap templat contoh (di luarcompile
fungsi).compile
fungsi), dan kemudian memungkinkanng-repeat
untuk menduplikatnya.Jika ada 1000 item dalam
raws
koleksi, opsi yang terakhir mungkin lebih cepat dari yang sebelumnya.Melakukan:
Tidak
sumber
Fungsi pengontrol
controller
Fungsi masing-masing direktif dipanggil setiap kali elemen terkait baru dipakai.Secara resmi,
controller
fungsinya adalah di mana satu:Sekali lagi, penting untuk diingat bahwa jika arahan melibatkan lingkup terisolasi, properti di dalamnya yang mewarisi dari lingkup induk belum tersedia.
Melakukan:
Tidak:
sumber
Fungsi pasca-tautan
Ketika
post-link
fungsi dipanggil, semua langkah sebelumnya telah terjadi - mengikat, transklusi, dll.Ini biasanya merupakan tempat untuk memanipulasi DOM yang diberikan lebih lanjut.
Melakukan:
sumber
Fungsi pra-tautan
pre-link
Fungsi masing-masing direktif dipanggil setiap kali elemen terkait baru dipakai.Seperti yang terlihat sebelumnya di bagian urutan kompilasi,
pre-link
fungsi disebut parent-then-child, sedangkanpost-link
fungsi dipanggilchild-then-parent
.The
pre-link
Fungsi jarang digunakan, namun dapat berguna dalam skenario khusus; misalnya, ketika seorang anak kontroler mendaftarkan dirinya dengan pengendali orangtua, tetapi pendaftaran harus denganparent-then-child
cara (ngModelController
melakukan hal-hal seperti ini).Tidak:
sumber