AngularJS dan penggunaannya Variabel Dolar

128

Apakah ada yang tahu jika alasan di balik penggunaan metode dolar dan variabel dalam angularJS adalah untuk menginstruksikan angularJS untuk menghindari memeriksa nilai-nilai tersebut ketika pencernaan sedang terjadi? Jadi, jika sudut muncul $scope.$valuedan $scope.value, maka itu akan menghindari memeriksa yang pertama karena diawali dengan karakter dolar dalam nama variabelnya?

matsko
sumber
Lihat juga posting blog ini, tentang perbedaan "$ scope" dan "scope" di angularjs ...
MarcoS
19
Angular mungkin mencoba mengambil $ dari jQuery.
daniel1426
Tautan itu mengalihkan ke halaman yang tidak menjelaskan banyak tentang $ scope.
Paul Brannan
5
Dokumen untuk direktif - pengontrol memiliki $scope, tetapi direktif memiliki scope. WTF?
LeeGee

Jawaban:

87

Ada beberapa kali Angular mengabaikan variabel yang diawali dengan tanda dolar:

  1. Dalam komentar Schumli di bawah, di mana filter json tidak akan menampilkannya
  2. Saat menggunakan {{ }}arahan, angular tidak akan menampilkan variabel bersarang $ . Misalnya ini hanya menampilkan visibleproperti.

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
  3. Selain itu ketika menambahkan pengamat eksplisit pada objek lingkup, perubahan ke properti dengan tanda dolar terkemuka dari objek ini tidak akan memicu pengamat. Lihat biola yang diperbarui ini .

  4. angular.equals() mengabaikan kunci yang diawali dengan$ .

Roy Truelove
sumber
Ya sepertinya kamu benar. Bahkan dengan peristiwa klik dan sebagainya masih berubah. Terima kasih.
matsko
7
Ada bagian-bagian tertentu dari Angular yang mengabaikan properti awalan, misalnya filter 'json' tidak akan menampilkan variabel yang dimulai dengan '$'.
Schmuli
116

Itu hanya konvensi penamaan dari cuplikan di bawah ini http://docs.angularjs.org/tutorial/step_05

Konvensi Penamaan Awalan '$'
Anda dapat membuat layanan Anda sendiri, dan pada kenyataannya kami akan melakukan hal itu pada langkah 11. Sebagai konvensi penamaan, layanan bawaan sudut, metode Lingkup dan beberapa API sudut lainnya memiliki awalan '$' di depan nama. Jangan gunakan awalan '$' saat memberi nama layanan dan model Anda, untuk menghindari kemungkinan tabrakan penamaan.

http://docs.angularjs.org/guide/concepts#angular_namespace

Angular Namespace
Untuk mencegah tabrakan nama yang tidak disengaja, Angular memberi awalan nama-nama objek yang berpotensi bertabrakan dengan $. Tolong jangan gunakan $ awalan dalam kode Anda karena mungkin secara tidak sengaja bertabrakan dengan kode Angular.

venkat
sumber
2
Mengapa directive doc [1] ada $scopedi controller, tetapi scopedalam directive? --- [1] docs.angularjs.org/guide/directive
LeeGee
2
@ LeeGee Ini hanya konvensi. stackoverflow.com/a/19289054/114558
rinogo
30

The $angka di depan menunjukkan sebuah variabel, parameter, properti, atau metode yang dimiliki inti dari sudut.

Properti pada objek yang berasal di dalam kerangka kerja, tetapi sebenarnya bukan bagian dari API, dapat dimulai dengan $- atau bahkan $$- untuk menunjukkan metode atau properti pribadi . Ini adalah cara yang sama dengan _awalan yang sering digunakan di perpustakaan lain.

Itu tidak memiliki efek pada cara kode ditafsirkan oleh runtime, meskipun kerangka itu sendiri dapat memberikan makna khusus. Pada dasarnya, ini adalah konvensi penamaan yang mengatakan "Anda tidak boleh main-main dengan ini".

dalgard
sumber
Saya pikir Anda salah paham. The runtime tidak peduli apa variabel yang bernama. Anda bisa menyebutnya $$__$_$- itu hanya pengidentifikasi tanpa arti khusus untuk penerjemah.
dalgard
Saya menambahkan beberapa kata untuk menyoroti perbedaan antara runtime dan framework; berbaik hati untuk mengubah suara Anda.
dalgard
7

Tidak sepenuhnya yakin, tapi saya percaya internal AngularJS mengandalkan memanipulasi variabel $-prefixed ini selama intisari. Memeriksa variabel-variabel ini akan berarti bahwa pencernaan tidak akan pernah stabil, karena mereka dapat terus berubah selama setiap siklus pencernaan.

Tapi jangan mengutip saya tentang itu. :)

btford
sumber
10
Diturunkan karena: "Jangan mengutip saya di atasnya". Maaf, tetapi jawaban yang mengakui ketidakpastian bukanlah jawaban yang sangat berguna :(
David Rivers
2
Downvote dikonversi menjadi up-. Dengan asumsi Anda benar, ini sekarang jawaban yang berguna!
David Rivers
2
@ DavidvidRivers, jika jawabannya awalnya ragu-ragu, menulis ulang itu tidak akan membuatnya lebih berguna. Bahkan, jawabannya bisa salah dan kurangnya keraguan akan menyatakan potensi kesalahan . Alih-alih, agar jawaban ini dianggap berguna, harus didukung dengan beberapa bukti dengan mengutip sumber tepercaya , atau menyediakan biola untuk mereproduksi poin yang diungkapkan.
Ivaylo Slavov
1
@IvayloSlavov: Saya sangat setuju dengan Anda. Saya berasumsi (mungkin salah) bahwa penjawab mengecek apakah dia benar dan tidak hanya menulis ulang jawaban untuk menghilangkan ketidakpastian. Saya kira saya seharusnya menginginkan sumber atau biola.
David Rivers
1
@AlexFord: Hei, teman. Terima kasih atas permintaan maafnya! Maaf saya tidak jelas dan memulai semua miskomunikasi ini. Poin Anda valid dan saya setuju dengan Anda. Saya hanya ingin memastikan bahwa saya tidak salah diartikan, tetapi saya tidak jelas dengan kata-kata saya sendiri. Ngomong-ngomong, tidak ada perasaan keras dan saya benar-benar menghargai bahwa Anda bisa melihat sudut pandang saya. Ceria, teman!
David Rivers
5

Saya selalu menganggap $sepertinya "S" untuk layanan.

Marc M.
sumber
itu jawaban yang benar. Ini logis dan sederhana. Ini sebenarnya adalah layanan sehingga lebih baik untuk mengingat $ 'S' adalah untuk layanan. penjelasan sederhana yang bagus.
Yonk
2
$ scope adalah layanan?
deadend
5

Tanda-tanda dolar ( $ ) juga mencegah elemen untuk diulang (atau ditafsirkan) dalam arahan tertentu. Jadi misalnya properti yang dimulai dengan $ tidak digunakan ng-repeatkarena klausa if di dalam for loop :

if(collection.hasOwnProperty(key) && key.charAt(0) != '$')

Seseorang membuat masalah tentang topik di halaman github angulars


Dalam metode shallowCopyproperti yang dimulai dengan $$ dilewati karena klausa if saat iterasi properies :

if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {
Melayu
sumber
1

@MarcoS memberikan tautan ke https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope yang menjelaskan perbedaan antara $ scope dan scope. Saya menemukan ini berguna, menambah informasi dalam jawaban lain.

Dalam arahan sudut ada tautan dan pengontrol. Tautan adalah fungsi standar dengan seperangkat parameter tetap: ruang lingkup, elemen, objek atribut.

Argumen pengontrol dikelola oleh Angular injector dan tidak tergantung pesanan. Injektor menyelesaikan objek mana yang akan lewat dengan mencari parameter yang dimulai dengan $.

Penulis https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope lebih baik dalam menjelaskannya.

Bryan
sumber