Saya perlu melakukan beberapa operasi pada lingkup dan template. Tampaknya saya bisa melakukan itu baik dalam link
fungsi atau controller
fungsi (karena keduanya memiliki akses ke ruang lingkup).
Kapan itu terjadi ketika saya harus menggunakan link
fungsi dan bukan controller?
angular.module('myApp').directive('abc', function($timeout) {
return {
restrict: 'EA',
replace: true,
transclude: true,
scope: true,
link: function(scope, elem, attr) { /* link function */ },
controller: function($scope, $element) { /* controller function */ }
};
}
Juga, saya mengerti itu link
adalah dunia non-sudut. Jadi, saya bisa menggunakan $watch
, $digest
dan $apply
.
Apa pentingnya link
fungsi, ketika kita sudah memiliki pengontrol?
javascript
angularjs
angularjs-directive
Yugal Jindle
sumber
sumber
$watch
,$digest
dan$apply
. "?link
kita tidak melihat sihir sudut. yaitu tidak ada binding 2 way, dll. Hanya saja kita memiliki api sudut yang tersedia untuk digunakan.Jawaban:
Setelah saya awal perjuangan dengan
link
dancontroller
fungsi dan membaca cukup banyak tentang mereka, saya pikir sekarang aku punya jawabannya.Pertama mari kita pahami ,
Bagaimana arahan sudut bekerja secara singkat:
Kita mulai dengan templat (sebagai string atau dimuat ke string)
var templateString = '<div my-directive>{{5 + 10}}</div>';
Sekarang, ini
templateString
dibungkus sebagai elemen sudutvar el = angular.element(templateString);
Dengan
el
, sekarang kami mengompilasinya$compile
untuk mendapatkan kembali fungsi tautan .var l = $compile(el)
Inilah yang terjadi,
$compile
menelusuri seluruh templat dan mengumpulkan semua arahan yang dikenali.link
fungsinya dikumpulkan.link
fungsi dibungkus denganlink
fungsi baru dan dikembalikan sebagail
.Akhirnya, kami menyediakan
scope
fungsi untuk fungsil
(tautan) ini yang selanjutnya mengeksekusi fungsi tautan yang dibungkus dengan iniscope
dan elemen-elemen terkait.l(scope)
Ini menambahkan
template
sebagai simpul baru keDOM
dan memanggilcontroller
yang menambahkan arlojinya ke lingkup yang dibagi dengan templat di DOM.Membandingkan compile vs link vs controller :
Setiap arahan dikompilasi hanya sekali dan fungsi tautan dipertahankan untuk digunakan kembali. Oleh karena itu, jika ada sesuatu yang berlaku untuk semua instance dari direktif harus dilakukan di dalam
compile
fungsi directive .Sekarang, setelah kompilasi kita memiliki
link
fungsi yang dieksekusi ketika melampirkan templat ke DOM . Jadi, oleh karena itu kami melakukan semua yang spesifik untuk setiap instance dari arahan. Misalnya: melampirkan peristiwa , memutasikan template berdasarkan cakupan , dll.Akhirnya, controller dimaksudkan agar tersedia untuk hidup dan reaktif sementara arahan bekerja pada
DOM
(setelah terpasang). Karena itu:(1) Setelah mengatur tampilan [ V ] (yaitu templat) dengan tautan.
$scope
adalah [ M ]$controller
kami dan [ C ] kami di MVC(2) Manfaatkan pengikatan 2 arah dengan $ scope dengan mengatur jam tangan.
(3)
$scope
jam tangan diharapkan akan ditambahkan dalam pengontrol karena ini adalah apa yang menonton template selama waktu berjalan.(4) Akhirnya,
controller
juga digunakan untuk dapat berkomunikasi di antara arahan terkait. (SepertimyTabs
contoh di https://docs.angularjs.org/guide/directive )(5) Memang benar bahwa kita bisa melakukan semua ini dalam
link
fungsinya tetapi juga tentang pemisahan keprihatinan .Oleh karena itu, akhirnya kami memiliki yang berikut ini yang cocok dengan semua bagian dengan sempurna:
sumber
Mengapa pengendali dibutuhkan
Perbedaan antara
link
dancontroller
ikut bermain ketika Anda ingin menyusun arahan di DOM Anda dan mengekspos fungsi API dari arahan induk ke arahan bersarang.Dari dokumen :
Katakan Anda ingin memiliki dua arahan
my-form
danmy-text-input
dan Anda inginmy-text-input
arahan hanya muncul di dalammy-form
dan di tempat lain.Dalam hal ini, Anda akan mengatakan sementara mendefinisikan direktif
my-text-input
yang membutuhkan kontroler dariparent
elemen DOM menggunakan membutuhkan argumen, seperti ini:require: '^myForm'
. Sekarang controller dari elemen induk akaninjected
kelink
fungsi sebagai argumen keempat, berikut$scope, element, attributes
. Anda dapat memanggil fungsi pada pengontrol itu dan berkomunikasi dengan arahan induk.Selain itu, jika pengontrol seperti itu tidak ditemukan, kesalahan akan dinaikkan.
Mengapa menggunakan tautan?
Tidak ada kebutuhan nyata untuk menggunakan
link
fungsi jika ada yang mendefinisikancontroller
sejak$scope
tersedia di Internetcontroller
. Selain itu, ketika mendefinisikan keduanyalink
dancontroller
, seseorang perlu berhati-hati tentang urutan doa keduanya (controller
dieksekusi sebelumnya).Namun, sesuai dengan cara Angular , sebagian besar manipulasi DOM dan pengikatan 2 arah
$watchers
biasanya dilakukan dalamlink
fungsi sedangkan API untuk anak-anak dan$scope
manipulasi dilakukan dalamcontroller
. Ini bukan aturan yang keras dan cepat, tetapi hal itu akan membuat kode lebih modular dan membantu dalam pemisahan masalah (pengontrol akan mempertahankandirective
status danlink
fungsi akan mempertahankanDOM
+ binding luar).sumber
link
?controller
? Mengapa saya ingin menciptakan fungsi yang sama sekali baru hanya untuk menghindari mendefinisikan controller?The
controller
Fungsi / object merupakan abstraksi model-view-controller (MVC). Meskipun tidak ada yang baru untuk menulis tentang MVC, itu masih merupakan kemajuan sudut pandang yang paling signifikan: pisahkan masalah menjadi bagian-bagian yang lebih kecil. Dan itu, tidak lebih, jadi jika Anda perlu untuk bereaksi padaModel
perubahan yang datang dariView
yangController
adalah hak orang untuk melakukan pekerjaan itu.Cerita tentang
link
fungsi berbeda, itu datang dari sudut pandang yang berbeda dari MVC. Dan benar-benar penting, sekali kita ingin melewati batascontroller/model/view
(templat) .Mari kita mulai dengan parameter yang diteruskan ke
link
fungsi:Untuk memasukkannya
link
ke dalam konteks, kita harus menyebutkan bahwa semua arahan sedang melalui langkah-langkah proses inisialisasi ini: Kompilasi , Tautan . Ekstrak dari buku Brad Green dan Shyam Seshadri Angular JS :Fase kompilasi (saudara perempuan tautan, sebut saja di sini untuk mendapatkan gambar yang jelas):
Dalam fase ini, Angular berjalan DOM untuk mengidentifikasi semua arahan terdaftar dalam template. Untuk setiap arahan, itu kemudian mengubah DOM berdasarkan aturan arahan (templat, ganti, transclude, dan sebagainya), dan memanggil fungsi kompilasi jika ada. Hasilnya adalah fungsi template yang dikompilasi,
Fase tautan :
Sebuah contoh yang bagus bagaimana cara menggunakan
link
dapat ditemukan di sini: Membuat Arahan Kustom . Lihat contoh: Membuat Arahan yang Memanipulasi DOM , yang memasukkan "tanggal-waktu" ke halaman, disegarkan setiap detik.Cuplikan singkat dari sumber kaya di atas, menunjukkan manipulasi nyata dengan DOM. Ada fungsi terhubung ke layanan timeout $, dan juga dihapus dalam panggilan destruktor untuk menghindari kebocoran memori
sumber
compiler
danlink
. Pertanyaan mereka adalah bertanya mengapalink
ketika kita sudah punyacontroller
controller
vslink
harus lebih jelas ...link
ataucontroller
.controller
danlink
relatif jelek. Jadi, tim sudut harus memiliki alasan yang baik untuk itu, bukan hanya pilihan.