"Bagaimana this
dan $scope
bekerja di pengontrol AngularJS?"
Jawaban singkat :
this
- Ketika fungsi konstruktor controller dipanggil,
this
adalah controller.
- Ketika suatu fungsi yang didefinisikan pada suatu
$scope
objek dipanggil, this
adalah "ruang lingkup efek ketika fungsi itu dipanggil". Ini mungkin (atau mungkin tidak!) $scope
Adalah fungsi yang didefinisikan. Jadi, di dalam fungsinya, this
dan $scope
mungkin tidak sama.
$scope
- Setiap pengontrol memiliki
$scope
objek terkait .
- Fungsi pengontrol (konstruktor) bertanggung jawab untuk mengatur properti model dan fungsi / perilaku yang terkait
$scope
.
- Hanya metode yang didefinisikan pada
$scope
objek ini (dan objek lingkup induk, jika warisan prototipikal sedang dimainkan) dapat diakses dari HTML / view. Misalnya, dari ng-click
, filter, dll.
Jawaban panjang :
Fungsi pengontrol adalah fungsi konstruktor JavaScript. Ketika fungsi konstruktor dijalankan (misalnya, ketika tampilan dimuat), this
(yaitu, "konteks fungsi") diatur ke objek pengontrol. Jadi dalam fungsi konstruktor pengontrol "tab", ketika fungsi addPane dibuat
this.addPane = function(pane) { ... }
itu dibuat pada objek controller, bukan pada $ scope. Tampilan tidak dapat melihat fungsi addPane - mereka hanya memiliki akses ke fungsi yang didefinisikan pada $ scope. Dengan kata lain, dalam HTML, ini tidak akan berfungsi:
<a ng-click="addPane(newPane)">won't work</a>
Setelah fungsi konstruktor pengontrol "tab" dijalankan, kami memiliki yang berikut:
Garis hitam putus-putus menunjukkan pewarisan prototipal - ruang lingkup prototip mewarisi dari Lingkup . (Ini tidak mewarisi secara prototipik dari ruang lingkup yang berlaku di mana arahan ditemukan dalam HTML.)
Sekarang, fungsi tautan pane direktif ingin berkomunikasi dengan direktif tab (yang benar-benar berarti perlu mempengaruhi tab mengisolasi $ scope dalam beberapa cara). Acara dapat digunakan, tetapi mekanisme lain adalah memiliki panel direktif require
pengontrol tab. (Tampaknya tidak ada mekanisme untuk arahan panel ke require
tab $ lingkup.)
Jadi, ini menimbulkan pertanyaan: jika kita hanya memiliki akses ke tabs controller, bagaimana kita mendapatkan akses ke tabs isolate $ scope (yang sebenarnya kita inginkan)?
Nah, garis putus-putus merah adalah jawabannya. "Scope" fungsi addPane () (saya mengacu pada lingkup fungsi / penutupan JavaScript di sini) memberikan akses fungsi ke tabs isolate $ scope. Yaitu, addPane () memiliki akses ke "tab IsolateScope" pada diagram di atas karena penutupan yang dibuat ketika addPane () didefinisikan. (Jika sebaliknya kami mendefinisikan addPane () pada objek $ lingkup objek, arahan panel tidak akan memiliki akses ke fungsi ini, dan karenanya itu tidak akan memiliki cara untuk berkomunikasi dengan tab $ lingkup.)
Untuk menjawab bagian lain dari pertanyaan Anda how does $scope work in controllers?
::
Dalam fungsi yang didefinisikan pada $ scope, this
diset ke "$ scope yang berlaku di mana / kapan fungsi dipanggil". Misalkan kita memiliki HTML berikut:
<div ng-controller="ParentCtrl">
<a ng-click="logThisAndScope()">log "this" and $scope</a> - parent scope
<div ng-controller="ChildCtrl">
<a ng-click="logThisAndScope()">log "this" and $scope</a> - child scope
</div>
</div>
Dan ParentCtrl
(Hanya) memiliki
$scope.logThisAndScope = function() {
console.log(this, $scope)
}
Mengklik tautan pertama akan menunjukkan hal itu this
dan $scope
sama, karena " ruang lingkup efek ketika fungsi dipanggil " adalah ruang lingkup yang terkait dengan ParentCtrl
.
Mengklik link kedua akan mengungkapkan this
dan $scope
yang tidak sama, karena " lingkup berlaku ketika fungsi dipanggil " adalah ruang lingkup terkait dengan ChildCtrl
. Jadi di sini, this
diatur untuk ChildCtrl
's $scope
. Di dalam metode, $scope
masih ParentCtrl
$ lingkup.
Biola
Saya mencoba untuk tidak menggunakan this
di dalam fungsi yang didefinisikan pada $ scope, karena menjadi membingungkan $ scope mana yang terpengaruh, terutama mengingat bahwa ng-repeat, ng-include, ng-switch, dan arahan semua dapat membuat cakupan anak mereka sendiri.