Saya membaca tentang sintaks baru dari angularJS tentangcontroller as xxx
Sintaksnya
InvoiceController as invoice
memberitahu Angular untuk membuat instantiate controller dan menyimpannya dalam faktur variabel dalam lingkup saat ini.
Visualisasi:
Ok, jadi saya tidak akan memiliki parameter $scope
di pengontrol saya dan kode akan jauh lebih bersih di pengontrol.
Tapi
Saya harus menentukan alias lain dalam tampilan
Jadi Sampai sekarang saya bisa melakukan:
<input type="number" ng-model="qty" />
....controller('InvoiceController', function($scope) {
// do something with $scope.qty <--notice
Dan sekarang saya bisa melakukan:
<input type="number" ng-model="invoic.qty" /> <-- notice
....controller('InvoiceController', function() {
// do something with this.qty <--notice
Pertanyaan
Apa tujuan melakukannya? menghapus dari satu tempat dan menambahkan ke tempat lain?
Saya akan senang melihat apa yang saya lewatkan.
javascript
angularjs
Royi Namir
sumber
sumber
controller as
memperbaikinya).Jawaban:
Ada beberapa hal tentang itu.
Beberapa orang tidak menyukai
$scope
sintaks (jangan tanya saya mengapa). Mereka mengatakan bahwa mereka bisa saja menggunakanthis
. Itulah salah satu tujuannya.Memperjelas dari mana sebuah properti berasal juga sangat berguna.
Anda dapat menyarangkan pengontrol dan saat membaca html, cukup jelas di mana setiap properti berasal.
Anda juga dapat menghindari beberapa masalah aturan titik .
Misalnya, memiliki dua pengontrol, keduanya dengan nama 'nama' yang sama, Anda dapat melakukan ini:
Anda dapat memodifikasi orang tua dan anak, tidak masalah tentang itu. Tapi Anda perlu menggunakan
$parent
untuk melihat nama orang tua, karena Anda membayangi pengontrol anak Anda. Dalam kode html masif$parent
bisa jadi bermasalah, Anda tidak tahu dari mana nama itu berasal.Dengan
controller as
Anda dapat melakukan:Contoh yang sama, tetapi jauh lebih jelas untuk dibaca.
$scope
plunkercontroller as
plunkersumber
foo() { ... }
jauh lebih bersih dari$scope.foo = function() { ... }
.Keuntungan utama dengan
controller as
sintaks yang saya lihat adalah Anda dapat bekerja dengan pengontrol sebagai kelas, bukan hanya beberapa fungsi dekorasi ruang lingkup, dan memanfaatkan pewarisan. Saya sering mengalami situasi ketika ada fungsi yang sangat mirip dengan sejumlah pengontrol, dan hal yang paling jelas untuk dilakukan adalah membuatBaseController
kelas dan mewarisinya.Meskipun ada $ scope inheritence, yang sebagian memecahkan masalah ini, beberapa orang lebih suka menulis kode dengan cara yang lebih OOP, yang menurut saya, membuat kode lebih mudah untuk dipikirkan dan diuji.
Berikut biola untuk didemonstrasikan: http://jsfiddle.net/HB7LU/5796/
sumber
Saya yakin satu keuntungan khusus jelas ketika Anda memiliki cakupan bersarang. Sekarang akan benar-benar jelas dari lingkup apa referensi properti berasal.
sumber
Sumber
Perbedaan antara Membuat pengontrol menggunakan
$scope object
dan Menggunakan“controller as”
sintaks dan vmMembuat pengontrol menggunakan objek $ scope
Biasanya kita membuat pengontrol menggunakan objek $ scope seperti yang ditunjukkan pada daftar di bawah ini:
Di atas kita membuat AddController dengan tiga variabel dan satu perilaku, menggunakan pengontrol dan tampilan objek $ scope, yang berbicara satu sama lain. Objek $ scope digunakan untuk meneruskan data dan perilaku ke tampilan. Ini merekatkan tampilan dan pengontrol bersama.
Pada dasarnya objek $ scope melakukan tugas-tugas berikut:
Meneruskan data dari pengontrol ke tampilan
Meneruskan perilaku dari pengontrol ke tampilan
Rekatkan pengontrol dan tampilan bersama
Objek $ scope diubah saat tampilan berubah dan tampilan diubah ketika properti dari objek $ scope berubah
Kami melampirkan properti ke objek $ scope untuk meneruskan data dan perilaku ke tampilan. Sebelum menggunakan objek $ scope di controller, kita perlu meneruskannya ke fungsi controller sebagai dependensi.
Menggunakan sintaks "controller as" dan vm
Kita dapat menulis ulang pengontrol di atas menggunakan pengontrol sebagai sintaks dan variabel vm seperti yang ditunjukkan pada daftar di bawah ini:
Pada dasarnya kami menetapkan ini ke variabel vm dan kemudian melampirkan properti dan perilaku ke sana. Pada tampilan kita dapat mengakses AddVmController menggunakan pengontrol sebagai sintaks. Ini ditunjukkan dalam daftar di bawah ini:
Tentu saja kita bisa menggunakan nama lain selain "vm" di controller sebagai sintaks. Di bawah tenda, AngularJS membuat objek $ scope dan melampirkan properti dan perilaku. Namun dengan menggunakan pengontrol sebagai sintaks, kode di pengontrol sangat bersih dan hanya nama alias yang terlihat di tampilan.
Berikut beberapa langkah untuk menggunakan pengontrol sebagai sintaks:
Buat pengontrol tanpa objek $ scope.
Tetapkan ini ke variabel lokal. Saya lebih suka nama variabel sebagai vm, Anda dapat memilih nama pilihan Anda.
Lampirkan data dan perilaku ke variabel vm.
Pada tampilan, berikan alias ke pengontrol menggunakan pengontrol sebagai sintaks.
Anda dapat memberikan nama apa pun ke alias. Saya lebih suka menggunakan vm kecuali saya tidak bekerja dengan pengontrol bersarang.
Dalam membuat pengontrol, tidak ada keuntungan atau kerugian langsung menggunakan pendekatan objek $ scope atau pengontrol sebagai sintaks. Ini murni masalah pilihan, namun, menggunakan pengontrol sebagai sintaks membuat kode JavaScript pengontrol lebih mudah dibaca dan mencegah masalah apa pun yang terkait dengan konteks ini.
Kontroler bersarang dalam pendekatan objek $ scope
Kami memiliki dua pengontrol seperti yang ditunjukkan pada daftar di bawah ini:
Properti "age" ada di dalam kedua pengontrol, dan pada tampilan kedua pengontrol ini bisa disarangkan seperti yang ditunjukkan dalam daftar di bawah ini:
Seperti yang Anda lihat, untuk mengakses properti age dari kontroler induk kita menggunakan $ parent.age. Pemisahan konteks tidak terlalu jelas di sini. Tetapi menggunakan pengontrol sebagai sintaks, kita dapat bekerja dengan pengontrol bersarang dengan cara yang lebih elegan. Katakanlah kita memiliki pengontrol seperti yang ditunjukkan pada daftar di bawah ini:
Pada tampilan, kedua pengontrol ini dapat disarangkan seperti yang ditunjukkan pada daftar di bawah ini:
Dalam pengontrol sebagai sintaks, kami memiliki kode yang lebih mudah dibaca dan properti induk dapat diakses menggunakan nama alias dari pengontrol induk daripada menggunakan sintaks $ induk.
Saya akan menyimpulkan posting ini dengan mengatakan bahwa itu murni pilihan Anda apakah Anda ingin menggunakan controller sebagai sintaks atau objek $ scope. Tidak ada keuntungan atau kerugian yang besar untuk keduanya, hanya saja pengontrol sebagai sintaks yang Anda kontrol pada konteksnya sedikit lebih mudah untuk dikerjakan, mengingat pemisahan yang jelas dalam pengontrol bersarang pada tampilan.
sumber
Saya menemukan keuntungan utama adalah api yang lebih intuitif karena metode / properti dikaitkan dengan contoh pengontrol secara langsung dan bukan objek lingkup. Pada dasarnya, dengan pendekatan lama, pengontrol hanya menjadi dekorasi untuk membangun objek lingkup.
Berikut beberapa info lebih lanjut tentang ini: http://www.syntaxsuccess.com/viewarticle/551798f20c5f3f3c0ffcc9ff
sumber
Dari apa yang saya baca, $ scope akan dihapus di Angular 2.0, atau setidaknya bagaimana kami melihat penggunaan $ scope. Mungkin baik untuk mulai menggunakan pengontrol saat rilis 2.0 semakin dekat.
Tautan video di sini untuk diskusi lebih lanjut tentang itu.
sumber