"Bagaimana thisdan $scopebekerja di pengontrol AngularJS?"
Jawaban singkat :
this
- Ketika fungsi konstruktor controller dipanggil,
thisadalah controller.
- Ketika suatu fungsi yang didefinisikan pada suatu
$scopeobjek dipanggil, thisadalah "ruang lingkup efek ketika fungsi itu dipanggil". Ini mungkin (atau mungkin tidak!) $scopeAdalah fungsi yang didefinisikan. Jadi, di dalam fungsinya, thisdan $scopemungkin tidak sama.
$scope
- Setiap pengontrol memiliki
$scopeobjek terkait .
- Fungsi pengontrol (konstruktor) bertanggung jawab untuk mengatur properti model dan fungsi / perilaku yang terkait
$scope.
- Hanya metode yang didefinisikan pada
$scopeobjek 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 requirepengontrol tab. (Tampaknya tidak ada mekanisme untuk arahan panel ke requiretab $ 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, thisdiset 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 thisdan $scopesama, karena " ruang lingkup efek ketika fungsi dipanggil " adalah ruang lingkup yang terkait dengan ParentCtrl.
Mengklik link kedua akan mengungkapkan thisdan $scopeyang tidak sama, karena " lingkup berlaku ketika fungsi dipanggil " adalah ruang lingkup terkait dengan ChildCtrl. Jadi di sini, thisdiatur untuk ChildCtrl's $scope. Di dalam metode, $scopemasih ParentCtrl$ lingkup.
Biola
Saya mencoba untuk tidak menggunakan thisdi 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.