Pertanyaan ini sudah dipukuli sampai mati, tetapi saya akan tetap membagikannya kalau-kalau ada orang di luar sana yang berjuang dengan kekacauan mengerikan yang menjadi cakupan AngularJS. Akan penutup ini =
, <
, @
, &
dan ::
. Tulisan lengkap dapat ditemukan di sini .
=
membangun ikatan dua arah. Mengubah properti di induk akan menghasilkan perubahan pada anak, dan sebaliknya.
<
menetapkan satu cara mengikat, orangtua ke anak. Mengubah properti di induk akan menghasilkan perubahan pada anak, tetapi mengubah properti anak tidak akan mempengaruhi properti induk.
@
akan menetapkan pada properti child nilai string dari atribut tag. Jika atribut berisi ekspresi , properti anak diperbarui setiap kali ekspresi mengevaluasi ke string yang berbeda. Sebagai contoh:
<child-component description="The movie title is {{$ctrl.movie.title}}" />
bindings: {
description: '@',
}
Di sini, description
properti dalam lingkup anak akan menjadi nilai ekspresi saat ini "The movie title is {{$ctrl.movie.title}}"
, di mana movie
objek dalam lingkup induk.
&
agak sulit, dan pada kenyataannya sepertinya tidak ada alasan kuat untuk menggunakannya. Ini memungkinkan Anda untuk mengevaluasi ekspresi dalam lingkup induk, menggantikan parameter dengan variabel dari lingkup anak. Contoh ( plunk ):
<child-component
foo = "myVar + $ctrl.parentVar + myOtherVar"
</child-component>
angular.module('heroApp').component('childComponent', {
template: "<div>{{ $ctrl.parentFoo({myVar:5, myOtherVar:'xyz'}) }}</div>",
bindings: {
parentFoo: '&foo'
}
});
Diberikan parentVar=10
, ekspresi parentFoo({myVar:5, myOtherVar:'xyz'})
akan dievaluasi 5 + 10 + 'xyz'
dan komponen akan dirender sebagai:
<div>15xyz</div>
Kapan Anda ingin menggunakan fungsi berbelit-belit ini? &
sering digunakan oleh orang untuk meneruskan ke fungsi child callback dalam lingkup orang tua. Namun pada kenyataannya, efek yang sama dapat dicapai dengan menggunakan '<' untuk melewati fungsi, yang lebih mudah dan menghindari sintaks kurung kurawal untuk melewati parameter ( {myVar:5, myOtherVar:'xyz'}
). Mempertimbangkan:
Panggilan balik menggunakan &
:
<child-component parent-foo="$ctrl.foo(bar)"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo({bar:'xyz'})">Call foo in parent</button>',
bindings: {
parentFoo: '&'
}
});
Panggilan balik menggunakan <
:
<child-component parent-foo="$ctrl.foo"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo('xyz')">Call foo in parent</button>',
bindings: {
parentFoo: '<'
}
});
Perhatikan bahwa objek (dan array) dilewatkan dengan merujuk ke lingkup anak, tidak disalin. Apa artinya ini adalah bahwa bahkan jika itu adalah pengikatan satu arah, Anda bekerja dengan objek yang sama baik dalam lingkup orangtua dan anak.
Untuk melihat berbagai awalan yang sedang beraksi, buka plunk ini .
Mengikat satu kali (inisialisasi) menggunakan
::
[Dokumen resmi]
Versi AngularJS yang lebih baru memperkenalkan opsi untuk memiliki pengikatan satu kali, di mana properti lingkup anak diperbarui hanya sekali. Ini meningkatkan kinerja dengan menghilangkan kebutuhan untuk menonton properti induk. Sintaksnya berbeda dari di atas; untuk mendeklarasikan pengikatan satu kali, Anda menambahkan ::
di depan ekspresi dalam tag komponen :
<child-component
tagline = "::$ctrl.tagline">
</child-component>
Ini akan menyebarkan nilai tagline
lingkup anak tanpa membangun ikatan satu arah atau dua arah. Catatan : jika tagline
awalnya undefined
dalam lingkup induk, sudut akan menontonnya sampai itu berubah dan kemudian membuat pembaruan satu kali dari properti yang sesuai dalam lingkup anak.
Ringkasan
Tabel di bawah ini menunjukkan cara awalan bekerja tergantung pada apakah properti adalah objek, array, string, dll.