" AngularJS kontrolörlerinde nasıl çalışır this
ve $scope
çalışır?"
Kısa cevap :
this
- Denetleyici yapıcı işlevi çağrıldığında
this
denetleyicidir.
- Bir
$scope
nesne üzerinde tanımlanan bir fonksiyon çağrıldığında, this
"fonksiyon çağrıldığında yürürlükte olan kapsam" dır. Bu $scope
, işlevin tanımlandığı gibi olabilir (veya olmayabilir!) . Yani, işlevin içinde this
ve $scope
olabilecek değil aynı.
$scope
- Her denetleyicinin ilişkili bir
$scope
nesnesi vardır.
- Bir denetleyici (yapıcı) işlevi, ilişkili model özelliklerini ve işlevlerini / davranışlarını ayarlamaktan sorumludur
$scope
.
$scope
HTML / görünümden yalnızca bu nesne üzerinde tanımlanan yöntemlere (ve prototip miras varsa üst kapsam nesnelerine) erişilebilir. Örneğin, ng-click
filtreler vb.
Uzun cevap :
Denetleyici işlevi bir JavaScript yapıcı işlevidir. Yapıcı işlevi yürütüldüğünde (örneğin, bir görünüm yüklendiğinde) this
(yani, "işlev bağlamı") denetleyici nesnesine ayarlanır. Yani "tabs" denetleyici yapıcı işlevinde, addPane işlevi oluşturulduğunda
this.addPane = function(pane) { ... }
$ scope üzerinde değil, controller nesnesinde oluşturulur. Görünümler addPane işlevini göremez - yalnızca $ kapsamında tanımlanan işlevlere erişebilir. Başka bir deyişle, HTML'de bu çalışmaz:
<a ng-click="addPane(newPane)">won't work</a>
"Sekmeler" denetleyici yapıcı işlevi yürütüldükten sonra, aşağıdakilere sahibiz:
Kesik siyah çizgi Kalıtım gösterir - bir izole kapsamı prototip devralır Kapsamı . (HTML'de direktifle karşılaşılan kapsamdan prototipik olarak miras kalmaz.)
Şimdi, bölme yönergesinin bağlantı işlevi sekmeler yönergesi ile iletişim kurmak istiyor (bu gerçekten sekmeleri etkilemek anlamına gelir $ kapsamı bir şekilde izole etmek). Olaylar kullanılabilir, ancak başka bir mekanizma bölmenin require
sekmeler denetleyicisini yönlendirmesini sağlamaktır. ( require
$ Yönergelerine ilişkin sekme yönergesi için bir mekanizma yok gibi görünüyor .)
Yani, bu şu soruyu akla getiriyor: eğer sadece sekmeler denetleyicisine erişimimiz varsa, sekmelere nasıl erişebiliriz $ scope isolate (gerçekten istediğimiz budur)?
Kırmızı noktalı çizgi cevaptır. AddPane () işlevinin "kapsamı" (burada JavaScript'in işlev kapsamına / kapanışlarına atıfta bulunuyorum) işlevin sekme yalıtımı $ kapsamına erişim sağlar. Yani, addPane (), addPane () tanımlandığında oluşturulan bir kapatma nedeniyle yukarıdaki diyagramdaki "sekmeler IsolateScope" a erişebilir. (Bunun yerine, tabs $ scope nesnesinde addPane () tanımlamış olsaydık, bölme yönergesinin bu işleve erişimi olmaz ve dolayısıyla $ scope sekmeleriyle iletişim kurmanın bir yolu olmazdı.)
Sorunuzun diğer kısmını cevaplamak için how does $scope work in controllers?
:
$ Scope üzerinde tanımlanan fonksiyonlar içinde, this
"fonksiyonun nerede / ne zaman çağrıldığı $ scope" olarak ayarlanır. Aşağıdaki HTML koduna sahip olduğumuzu varsayalım:
<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>
Ve ParentCtrl
(Yalnızca)
$scope.logThisAndScope = function() {
console.log(this, $scope)
}
İlk bağlantıya tıkladığınızda gösterecektir this
ve $scope
"çünkü aynı işlevi çağrıldı yürürlükte kapsamı " ile ilişkili kapsamı ParentCtrl
.
İkinci bağlantıya tıkladığınızda ortaya çıkaracaktır this
ve $scope
vardır değil "çünkü aynı işlevi çağrıldı yürürlükte kapsamı " ile ilişkili kapsamı ChildCtrl
. İşte burada, 's this
olarak ayarlanmıştır . Yöntemin içinde hala 's $ kapsamı var.ChildCtrl
$scope
$scope
ParentCtrl
Vaktini boşa harcamak
this
Hangi $ kapsamının etkilendiğini karıştırdığından, özellikle ng-repeat, ng-include, ng-switch ve direktiflerin tümünün kendi alt kapsamlarını oluşturabileceği göz önüne alındığında, $ scope üzerinde tanımlanan bir fonksiyonun içinde kullanmaya çalışmıyorum .