Apa perbedaan antara & vs @ dan = di angularJS


Jawaban:


375

@memungkinkan nilai yang didefinisikan pada atribut direktif untuk diteruskan ke ruang lingkup direktif direktif. Nilainya bisa berupa nilai string sederhana ( myattr="hello") atau bisa juga string yang diinterpolasi AngularJS dengan ekspresi yang tertanam ( myattr="my_{{helloText}}"). Anggap saja sebagai komunikasi "satu arah" dari ruang lingkup orang tua ke dalam arahan anak. John Lindquist memiliki serangkaian screencasts pendek yang menjelaskan masing-masing. Screencast pada @ ada di sini: https://egghead.io/lessons/angularjs-isolate-scope-attribute-binding

&memungkinkan lingkup isolat direktif untuk meneruskan nilai ke lingkup induk untuk evaluasi dalam ekspresi yang didefinisikan dalam atribut. Perhatikan bahwa atribut direktif secara implisit merupakan ekspresi dan tidak menggunakan sintaks ekspresi kurawal ganda. Yang ini lebih sulit untuk dijelaskan dalam teks. Screencast pada & ada di sini: https://egghead.io/lessons/angularjs-isolate-scope-expression-binding

=mengatur ekspresi pengikatan dua arah antara ruang lingkup direktif direktif dan ruang lingkup induk. Perubahan dalam lingkup anak disebarkan ke orang tua dan sebaliknya. Pikirkan = sebagai kombinasi @ dan &. Screencast on = ada di sini: https://egghead.io/lessons/angularjs-isolate-scope-two-way-binding

Dan akhirnya di sini adalah screencast yang menunjukkan ketiganya digunakan bersama dalam satu tampilan: https://egghead.io/lessons/angularjs-isolate-scope-review



1
Terima kasih atas info, saya memperbarui jawaban saya dengan URL yang benar.
cliff.meyers

43
Sangat memalukan bahwa tautan jawaban berperingkat teratas ke video di balik dinding berbayar ketika mungkin ada banyak konten gratis di luar sana yang berisi info yang sama.
BenCr

Ada banyak video yang disediakan secara gratis oleh
egghead

7
minus satu untuk konten berbayar.
Arel Sapir

109

Saya ingin menjelaskan konsep-konsep dari perspektif warisan prototipe JavaScript. Semoga membantu mengerti.

Ada tiga opsi untuk menentukan ruang lingkup arahan:

  1. scope: false: Default sudut. Ruang lingkup direktif adalah persis salah satu ruang lingkup induknya ( parentScope).
  2. scope: true: Angular menciptakan ruang lingkup untuk arahan ini. Cakupan prototipically mewarisi dari parentScope.
  3. scope: {...}: lingkup terisolasi dijelaskan di bawah ini.

Menentukan scope: {...}mendefinisikan suatu isolatedScope. An isolatedScopetidak mewarisi properti dari parentScope, meskipun isolatedScope.$parent === parentScope. Ini didefinisikan melalui:

app.directive("myDirective", function() {
    return {
        scope: {
            ... // defining scope means that 'no inheritance from parent'.
        },
    }
})

isolatedScopetidak memiliki akses langsung ke parentScope. Tetapi kadang - kadang arahan perlu berkomunikasi dengan parentScope. Mereka berkomunikasi melalui @, =dan &. Topik tentang menggunakan simbol @, =dan &berbicara tentang skenario menggunakanisolatedScope .

Biasanya digunakan untuk beberapa komponen umum yang dibagikan oleh halaman yang berbeda, seperti Modals. Ruang lingkup yang terisolasi mencegah polusi ruang lingkup global dan mudah untuk dibagikan di antara halaman.

Berikut ini adalah arahan dasar: http://jsfiddle.net/7t984sf9/5/ . Gambar untuk diilustrasikan adalah:

masukkan deskripsi gambar di sini

@: pengikatan satu arah

@cukup melewati properti dari parentScopeke isolatedScope. Ini disebut one-way binding, yang berarti Anda tidak dapat mengubah nilai parentScopeproperti. Jika Anda terbiasa dengan warisan JavaScript, Anda dapat memahami dua skenario ini dengan mudah:

  • Jika properti mengikat adalah tipe primitif, seperti interpolatedPropdalam contoh: Anda dapat memodifikasi interpolatedProp, tetapi parentProp1tidak akan diubah. Namun, jika Anda mengubah nilai parentProp1, interpolatedPropakan ditimpa dengan nilai baru (saat $ angular).

  • Jika properti yang mengikat adalah beberapa objek, seperti parentObj: karena yang diteruskan ke isolatedScopereferensi, memodifikasi nilai akan memicu kesalahan ini:

    TypeError: Cannot assign to read only property 'x' of {"x":1,"y":2}

=: mengikat dua arah

=dipanggil two-way binding, yang berarti setiap modifikasi dalam childScopejuga akan memperbarui nilai dalam parentScope, dan sebaliknya. Aturan ini berfungsi untuk primitif dan objek. Jika Anda mengubah jenis pengikatan parentObjmenjadi =, Anda akan menemukan bahwa Anda dapat mengubah nilai parentObj.x. Contoh tipikal adalah ngModel.

&: fungsi mengikat

&memungkinkan direktif untuk memanggil beberapa parentScopefungsi dan meneruskan beberapa nilai dari direktif. Misalnya, periksa JSFiddle: & dalam ruang lingkup direktif .

Tetapkan template yang dapat diklik dalam direktif seperti:

<div ng-click="vm.onCheck({valueFromDirective: vm.value + ' is from the directive'})">

Dan gunakan arahan seperti:

<div my-checkbox value="vm.myValue" on-check="vm.myFunction(valueFromDirective)"></div>

Variabel valueFromDirectivedilewatkan dari direktif ke pengendali induk melalui {valueFromDirective: ....

Referensi: Memahami Lingkup


Secara default, arahan menggunakan lingkup bersama. Jika direktif memiliki 'scope: true', maka direktif menggunakan lingkup, di mana anak dapat melihat properti induk tetapi orangtua tidak dapat melihat properti internal anak.
YuMei

1
AngularJS - Lingkup Terisolasi - @ vs = vs & ---------- Contoh singkat dengan penjelasan tersedia di tautan di bawah ini: codeforeach.com/angularjs/angularjs-isolated-scopes-vs-vs
Prashanth

24

Bukan biola saya, tetapi http://jsfiddle.net/maxisam/QrCXh/ menunjukkan perbedaannya. Bagian kuncinya adalah:

           scope:{
            /* NOTE: Normally I would set my attributes and bindings
            to be the same name but I wanted to delineate between 
            parent and isolated scope. */                
            isolatedAttributeFoo:'@attributeFoo',
            isolatedBindingFoo:'=bindingFoo',
            isolatedExpressionFoo:'&'
        }        

17

@ : penjilidan satu arah

= : penjilidan dua arah

& : mengikat fungsi


5
peringatan penting untuk @ bukan hanya string satu arah, tetapi dalam perjalanan
Shawson

@Shawson: Jadi, bagaimana cara mengikat non-string satu arah (mis. Int atau bool)?
ATAU Mapper

Jika hati Anda mengaturnya, Anda bisa mengambil nilai dari @ dan melemparkan ke int / bool? Kalau tidak, saya hanya akan menggunakan = atau <
Shawson

7

AngularJS - Lingkup Terisolasi - @ vs = vs &


Contoh singkat dengan penjelasan tersedia di tautan di bawah ini:

http://www.codeforeach.com/angularjs/angularjs-isolated-scopes-vs-vs

@ - satu arah mengikat

Dalam arahan:

scope : { nameValue : "@name" }

Dalam penglihatan:

<my-widget name="{{nameFromParentScope}}"></my-widget>

= - mengikat dua arah

Dalam arahan:

scope : { nameValue : "=name" },
link : function(scope) {
  scope.name = "Changing the value here will get reflected in parent scope value";
}

Dalam penglihatan:

<my-widget name="{{nameFromParentScope}}"></my-widget>

& - Panggilan fungsi

Dalam arahan:

scope : { nameChange : "&" }
link : function(scope) {
  scope.nameChange({newName:"NameFromIsolaltedScope"});
}

Dalam penglihatan:

<my-widget nameChange="onNameChange(newName)"></my-widget>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.