Di bagian "Buat Komponen" di beranda AngularJS , ada contoh ini:
controller: function($scope, $element) {
var panes = $scope.panes = [];
$scope.select = function(pane) {
angular.forEach(panes, function(pane) {
pane.selected = false;
});
pane.selected = true;
}
this.addPane = function(pane) {
if (panes.length == 0) $scope.select(pane);
panes.push(pane);
}
}
Perhatikan bagaimana select
metode ditambahkan $scope
, tetapi addPane
metode ditambahkan this
. Jika saya mengubahnya $scope.addPane
, kodenya rusak.
Dokumentasi mengatakan bahwa sebenarnya ada perbedaan, tetapi tidak menyebutkan apa perbedaannya:
Versi Angular sebelumnya (pra 1.0 RC) memungkinkan Anda untuk menggunakan metode ini secara
this
bergantian$scope
, tetapi ini tidak lagi menjadi masalah. Di dalam metode yang didefinisikan pada ruang lingkupthis
dan$scope
dapat dipertukarkan (set sudutthis
ke$scope
), tetapi tidak sebaliknya di dalam konstruktor controller Anda.
Bagaimana this
dan $scope
bekerja di pengontrol AngularJS?
angularjs
angularjs-scope
this
Alexei Boronine
sumber
sumber
Jawaban:
Jawaban singkat :
this
this
adalah controller.$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
$scope
objek terkait .$scope
.$scope
objek ini (dan objek lingkup induk, jika warisan prototipikal sedang dimainkan) dapat diakses dari HTML / view. Misalnya, daring-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 dibuatitu 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:
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 kerequire
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:Dan
ParentCtrl
(Hanya) memilikiMengklik tautan pertama akan menunjukkan hal itu
this
dan$scope
sama, karena " ruang lingkup efek ketika fungsi dipanggil " adalah ruang lingkup yang terkait denganParentCtrl
.Mengklik link kedua akan mengungkapkan
this
dan$scope
yang tidak sama, karena " lingkup berlaku ketika fungsi dipanggil " adalah ruang lingkup terkait denganChildCtrl
. Jadi di sini,this
diatur untukChildCtrl
's$scope
. Di dalam metode,$scope
masihParentCtrl
$ 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.sumber
Alasan 'addPane' ditugaskan untuk ini adalah karena
<pane>
arahan.The
pane
direktif tidakrequire: '^tabs'
, yang menempatkan objek tab controller dari direktif orang tua, ke dalam fungsi link.addPane
ditugaskanthis
agarpane
fungsi tautan dapat melihatnya. Kemudian padapane
fungsi tautan,addPane
hanyalah propertitabs
controller, dan itu hanya tabsControllerObject.addPane. Jadi fungsi penghubung panel pane dapat mengakses objek pengontrol tab dan karenanya mengakses metode addPane.Saya harap penjelasan saya cukup jelas .. agak sulit untuk dijelaskan.
sumber
Saya baru saja membaca penjelasan yang cukup menarik tentang perbedaan antara keduanya, dan semakin banyak preferensi untuk melampirkan model ke controller dan alias controller untuk mengikat model ke tampilan. http://toddmotto.com/digging-into-angulars-controller-as-syntax/ adalah artikelnya.
Dia tidak menyebutkannya tetapi ketika mendefinisikan arahan, jika Anda perlu berbagi sesuatu antara banyak arahan dan tidak menginginkan layanan (ada kasus yang sah di mana layanan merepotkan) kemudian lampirkan data ke pengontrol direktif induk.
The
$scope
layanan menyediakan banyak hal yang berguna,$watch
yang paling jelas, tetapi jika semua yang Anda butuhkan untuk data yang mengikat pandangan, menggunakan kontroler polos dan 'controller sebagai' dalam template baik-baik saja dan bisa dibilang lebih.sumber
Saya sarankan Anda untuk membaca posting berikut: AngularJS: "Controller as" atau "$ scope"?
Ini menjelaskan dengan sangat baik keuntungan menggunakan "Controller sebagai" untuk mengekspos variabel lebih dari "$ scope".
Saya tahu Anda bertanya secara spesifik tentang metode dan bukan variabel, tapi saya pikir lebih baik tetap berpegang pada satu teknik dan konsisten dengan itu.
Jadi menurut saya, karena masalah variabel yang dibahas dalam posting, lebih baik menggunakan teknik "Controller as" dan juga menerapkannya pada metode.
sumber
Dalam kursus ini ( https://www.codeschool.com/courses/shaping-up-with-angular-js ) mereka menjelaskan cara menggunakan "ini" dan banyak hal lainnya.
Jika Anda menambahkan metode ke pengontrol melalui metode "ini", Anda harus memanggilnya di tampilan dengan nama pengontrol "titik" properti atau metode Anda.
Misalnya menggunakan controller Anda dalam tampilan Anda mungkin memiliki kode seperti ini:
sumber
$scope
, jadi terima kasih sudah menyebutkannya.as
danthis
jadi bagaimana bisa membantu menjelaskan perbedaannya?$scope
yang tidak pernah disebutkan, saya belajar menggunakan hanyathis
di controller. Masalahnya adalah ketika Anda mulai memiliki untuk menangani janji-janji di controller Anda, Anda memiliki banyak masalah referensithis
dan harus mulai melakukan hal-hal sepertivar me = this
referensi modelthis
dari dalam dalam fungsi pengembalian janji. Jadi karena itu, saya masih sangat bingung tentang metode mana yang harus saya gunakan,$scope
atauthis
.var me = this
atau.bind(this)
kapan pun Anda melakukan Janji, atau hal-hal berat lainnya. Ini tidak ada hubungannya dengan Angular.ng-controller="MyCtrl as MC"
itu setara dengan menempatkan$scope.MC = this
di controller itu sendiri - itu mendefinisikan contoh (ini) dari MyCtrl pada ruang lingkup untuk digunakan dalam template via{{ MC.foo }}
Untuk mengembalikan perilaku ini (apakah ada yang tahu mengapa itu diubah?) Anda dapat menambahkan:
di akhir fungsi pengontrol Anda (asalkan $ scope disuntikkan ke fungsi pengontrol ini).
Ini memiliki efek yang bagus untuk memiliki akses ke ruang lingkup orang tua melalui objek pengontrol yang dapat Anda dapatkan pada anak
require: '^myParentDirective'
sumber
$ scope memiliki 'this' yang berbeda maka controller 'this'. Maka jika Anda meletakkan console.log (this) di dalam controller, ia memberi Anda objek (controller) dan this.addPane () menambahkan Metode addPane ke Object controller. Tetapi $ scope memiliki cakupan yang berbeda dan semua metode dalam cakupannya perlu diakses oleh $ scope.methodName ().
this.methodName()
inside controller artinya menambahkan methos di dalam objek controller.$scope.functionName()
dalam HTML dan di dalamRekatkan kode ini di editor Anda dan buka konsol untuk melihat ...
sumber