Bu soru çoktan dövüldü, ama yine de AngularJS kapsamları olan korkunç karışıklık ile mücadele ederse bunu paylaşacağım. Bu irade kapak =
, <
, @
, &
ve ::
. Tam yazımı burada bulabilirsiniz .
=
iki yönlü bir bağ kurar. Üst öğedeki mülkün değiştirilmesi, alt öğede değişikliğe neden olur veya bunun tersi de geçerlidir.
<
ebeveynten çocuğa tek yönlü bir bağ kurar. Üst öğedeki özelliğin değiştirilmesi alt öğede değişikliğe neden olur, ancak alt özelliğinin değiştirilmesi üst özelliği etkilemez.
@
child özelliğine tag özelliğinin dize değerini atar. Özellik bir ifade içeriyorsa, ifade farklı bir dizeye her değerlendirildiğinde child özelliği güncellenir. Örneğin:
<child-component description="The movie title is {{$ctrl.movie.title}}" />
bindings: {
description: '@',
}
Burada, description
alt kapsamdaki özellik , üst kapsamdaki bir nesnenin "The movie title is {{$ctrl.movie.title}}"
olduğu ifadenin geçerli değeri olacaktır movie
.
&
biraz zor ve aslında kullanmak için zorlayıcı bir neden yok gibi görünüyor. Parametreleri alt kapsamdaki değişkenlerle değiştirerek üst kapsamdaki bir ifadeyi değerlendirmenizi sağlar. Bir örnek ( plunk ):
<child-component
foo = "myVar + $ctrl.parentVar + myOtherVar"
</child-component>
angular.module('heroApp').component('childComponent', {
template: "<div>{{ $ctrl.parentFoo({myVar:5, myOtherVar:'xyz'}) }}</div>",
bindings: {
parentFoo: '&foo'
}
});
Verilen parentVar=10
, ifade olarak parentFoo({myVar:5, myOtherVar:'xyz'})
değerlendirilir 5 + 10 + 'xyz'
ve bileşen şu şekilde oluşturulur:
<div>15xyz</div>
Bu kıvrımlı işlevselliği ne zaman kullanmak istersiniz? &
genellikle kişiler tarafından alt kapsama geçmek için kullanılır ve üst kapsamdaki bir geri çağırma işlevi kullanılır. Bununla birlikte, gerçekte, aynı etki daha basit olan ve parametrelerin geçmesi için garip kıvırcık parantez sözdizimini önleyen '<' kullanılarak da elde edilebilir {myVar:5, myOtherVar:'xyz'}
. Düşünmek:
Şunu kullanarak geri arama &
:
<child-component parent-foo="$ctrl.foo(bar)"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo({bar:'xyz'})">Call foo in parent</button>',
bindings: {
parentFoo: '&'
}
});
Şunu kullanarak geri arama <
:
<child-component parent-foo="$ctrl.foo"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo('xyz')">Call foo in parent</button>',
bindings: {
parentFoo: '<'
}
});
Nesnelerin (ve dizilerin) kopyalanmayan alt kapsamı referans alınarak iletildiğini unutmayın. Bunun anlamı, tek yönlü bir bağlama olsa bile, hem üst hem de alt kapsamda aynı nesne ile çalışıyorsunuzdur.
Bu açın eylem farklı önekleri görmek için Düşmek .
Kullanarak bir kerelik ciltleme (başlatma)
::
[Resmi dokümanlar]
AngularJS'nin sonraki sürümlerinde, child scope özelliğinin yalnızca bir kez güncelleştirildiği tek seferlik bağlama seçeneği sunulur. Bu, üst mülkü izleme ihtiyacını ortadan kaldırarak performansı artırır. Sözdizimi yukarıdakinden farklıdır; bir kerelik bir bağlanma bildirmek ::
için bileşen etiketindeki ifadenin önüne eklersiniz :
<child-component
tagline = "::$ctrl.tagline">
</child-component>
Bu, değerini tagline
tek yönlü veya iki yönlü bir bağlantı oluşturmadan alt kapsamına yayar . Not : tagline
başlangıçta undefined
üst kapsamdaysa, açısal değişene kadar izler ve alt kapsamda ilgili özelliğin bir kerelik güncellemesini yapar.
özet
Aşağıdaki tablo, özelliğin nesne, dizi, dize vb. Olmasına bağlı olarak öneklerin nasıl çalıştığını gösterir.