Ada dua pola yang digunakan untuk mengakses fungsi pengontrol: this
dan $scope
.
Yang mana yang harus saya gunakan dan kapan? Saya mengerti this
diatur ke controller dan $scope
merupakan objek dalam rantai lingkup untuk dilihat. Tetapi dengan sintaks "Controller as Var" yang baru, Anda dapat dengan mudah menggunakan keduanya. Jadi yang saya tanyakan adalah apa yang terbaik dan apa arah untuk masa depan?
Contoh:
Menggunakan
this
function UserCtrl() { this.bye = function() { alert('....'); }; }
<body ng-controller='UserCtrl as uCtrl'> <button ng-click='uCtrl.bye()'>bye</button>
Menggunakan
$scope
function UserCtrl($scope) { $scope.bye = function () { alert('....'); }; }
<body ng-controller='UserCtrl'> <button ng-click='bye()'>bye</button>
Saya pribadi merasa this.name
lebih mudah di mata dan lebih alami dibandingkan dengan pola OO Javascript lainnya.
Mohon saran?
Jawaban:
Keduanya memiliki kegunaannya. Pertama, beberapa sejarah ...
$ scope adalah teknik "klasik" sementara "controller as" jauh lebih baru (pada versi 1.2.0 secara resmi meskipun ia muncul dalam pra-rilis yang tidak stabil sebelum ini).
Keduanya bekerja dengan sangat baik dan satu-satunya jawaban yang salah adalah mencampurkannya di aplikasi yang sama tanpa alasan eksplisit. Terus terang, mencampurkannya akan berhasil, tetapi itu hanya akan menambah kebingungan. Jadi pilih satu dan gulingkan dengan itu. Yang paling penting adalah konsisten.
Yang mana? Itu tergantung kamu. Ada banyak lagi contoh di luar sana dari $ scope, tetapi "controller as" juga ikut ambil bagian. Apakah yang satu lebih baik dari yang lain? Itu bisa diperdebatkan. Jadi, bagaimana Anda memilih?
Kenyamanan
Saya lebih suka "controller as" karena saya suka menyembunyikan lingkup $ dan mengekspos anggota dari controller ke tampilan melalui objek perantara. Dengan mengatur ini. *, Saya dapat mengekspos apa yang ingin saya paparkan dari controller ke view. Anda dapat melakukannya dengan $ scope juga, saya hanya lebih suka menggunakan JavaScript standar untuk ini. Bahkan, saya kode seperti ini:
Ini terasa lebih bersih bagi saya dan memudahkan untuk melihat apa yang terpapar pada tampilan. Perhatikan saya beri nama variabel yang saya kembalikan "vm", yang merupakan singkatan dari viewmodel. Itu hanya konvensi saya.
Dengan $ scope saya bisa melakukan hal yang sama, jadi saya tidak menambahkan atau mengurangi tekniknya.
Jadi terserah Anda di sana.
Injeksi
Dengan $ scope saya perlu menyuntikkan $ scope ke controller. Saya tidak harus melakukan ini dengan controller, kecuali saya membutuhkannya untuk alasan lain (seperti $ broadcast atau jam tangan, meskipun saya mencoba untuk menghindari jam tangan di controller).
UPDATE Saya menulis posting ini tentang 2 pilihan: http://www.johnpapa.net/do-you-like-your-angular-controllers-with-or-without-sugar/
sumber
var vm = this;
apakah Anda perlu menyebutnya 'vm' dalam tampilan juga? 'controller as vm'. Apakah mereka harus sama?$scope
sedang dihapus di Angular 2.0. Dengan demikian, menggunakanthis
akan menjadi pendekatan yang orang lain ingin ikuti karena tanggal rilis Angular 2.0 semakin dekat.sumber
Pendapat saya adalah bahwa 'ini' di javascript memiliki cukup banyak masalah sendiri, dan menambahkan arti / penggunaan lain untuk itu bukan ide yang baik.
Saya akan menggunakan $ scope, demi kejelasan.
MEMPERBARUI
Sekarang ada sintaks 'controller as', dibahas di sini . Saya bukan penggemar, tapi sekarang ini AngularJS yang lebih 'resmi', konstruksi ini patut mendapat perhatian.
sumber
Saya pikir Controller As lebih baik karena memungkinkan untuk lebih mudah bersarang lingkup seperti yang dijelaskan oleh Motto Todd di sini:
http://toddmotto.com/digging-into-angulars-controller-as-syntax/
Juga, itu akan memastikan bahwa Anda selalu memiliki setidaknya satu. dalam ekspresi mengikat Anda yang memaksa Anda untuk mengikuti jangan mengikat primitif rekomendasi .
Plus Anda dapat memisahkan dari lingkup yang akan hilang dalam 2.0.
sumber
Dokumentasi Angular secara eksplisit memberi tahu Anda bahwa penggunaan
this
disarankan. Itu, selain fakta yang$scope
sedang dihapus adalah alasan yang cukup bagi saya untuk tidak pernah menggunakan$scope
.sumber
"$ scope jason328 sedang dihapus dalam Angular 2.0" sepertinya alasan yang bagus untuk saya. Dan saya menemukan alasan lain untuk membantu saya membuat pilihan:
this
lebih mudah dibaca - ketika saya melihatfooCtrl.bar
dalam HTML, saya langsung tahu di mana menemukan definisibar
.Pembaruan: tidak lama setelah beralih ke
this
solusi, saya mulai ketinggalan$scope
cara yang kurang perlu mengetiksumber
Saya lebih suka kombinasi.
Log console.log sederhana dari $ scope dan 'this' setelah mengisinya dengan beberapa data tiruan akan menunjukkan itu.
$ scope memungkinkan akses ke bagian sampul pengendali, misalnya:
** Properti dan metode dengan $$ tidak disarankan untuk dipusingkan oleh tim Angular, tetapi $ dapat menjadi game yang aman untuk melakukan hal-hal keren dengan $ parent dan $ id.
'ini' langsung ke intinya, melampirkan data dan fungsi 2 arah terikat. Anda hanya akan melihat apa yang Anda lampirkan:
Jadi mengapa saya lebih suka kombinasi?
Dalam aplikasi bersarang ui-router, saya dapat mengakses controller utama, mengatur dan memanggil nilai-nilai universal dan fungsi di dalam controller anak:
Di Pengontrol Utama:
Dalam Kontrol Anak:
Sekarang, Anda dapat mengakses orang tua dari dalam anak dan anak dari orang tua!
sumber
Keduanya berfungsi, tetapi jika Anda menerapkan hal-hal yang sesuai untuk lingkup ke $ lingkup, dan jika Anda menerapkan hal-hal yang sesuai untuk pengontrol ke pengontrol, kode Anda akan mudah dipelihara. Untuk orang-orang yang mengatakan "Ugh, gunakan saja ruang lingkup, lupakan Pengontrol ini sebagai sintaksis" ... Ini mungkin bekerja sama tetapi saya bertanya-tanya bagaimana Anda akan dapat mempertahankan aplikasi besar tanpa kehilangan jejak.
sumber