vb bazı "olay" işlevleri gibi when-drop
, on-leave
, ng-click
, when-it-is-loaded
ile kullanılmaktadır.
İlk olarak, direktiflerine işlev başvuruları geçmek '=' kullanmak asla.
'=' iki saat oluşturur ve bunları hem yönerge kapsamı hem de ana kapsam referanslarının aynı olduğundan emin olmak için kullanır (iki yönlü ciltleme). Bir yönergesinin ana kapsamınızdaki bir işlev tanımını değiştirmesine izin vermek gerçekten kötü bir fikirdir; bu, bu tür bir bağlama kullandığınızda gerçekleşen şeydir. Ayrıca, saatler en aza indirilmelidir - işe yarayacak, iki ekstra $ saatler gereksizdir. Öyleyse bu iyi değil - oylamanın bir kısmı, bunu önerdi.
İkincisi - cevap, '&' ifadesinin ne yaptığını yanlış bildirir. &, "tek yönlü bir bağlantı" değildir. Bu yanlış yorumlayıcıyı basitçe alır çünkü '=' ifadesinden farklı olarak, herhangi bir $ saatler yaratmaz ve direktif kapsamındaki mülkün değerini değiştirmek ebeveyne yayılmaz.
Docs göre:
& veya & attr - bunu bir yönergede & kullandığınızda bağlamında ana kapsamını
bir ifade yürütmek için bir yol sağlar Üst kapsama göre değerlendirilen ifadenin değerini döndüren bir işlev oluşturur. İfadenin bir işlev çağrısı olması gerekmez. Herhangi bir geçerli açısal ifade olabilir. Buna ek olarak, bu oluşturulan işlev, ifadede bulunan herhangi bir yerel değişkenin değerini geçersiz kılan bir nesne argümanı alır. Eğer
foo({myVal: 42});
sana ne ararsanız, direktif (şablon veya bağlantı fonksiyonu) olarak
<my-component foo="go()">
:
ebeveyn varsayalım OP'ın örneğini genişletmek için aşağıdaki şekilde bu direktifini kullanır yapıyorsun "go()" ifadesini değerlendiriyor, bu da üst kapsamda "git" işlevini çağırıyor ve hiçbir argüman iletmiyor. Alternatif
,
<my-component foo="go(value)">
Temelde ($ parent.value)"
<my-component foo="go(myVal)">
$ parent.go çağırıyor olacak ebeveyn kapsamına ifadesi "go (değer)", değerlendiriyoruz
Sen ifadesi "go (MyVal)" değerlendiriyoruz ama ifade değerlendirilmeden önce, MyVal 42 ile değiştirilecek, böylece değerlendirilen ifadesi "(42) go" olacaktır.
<my-component foo="myVal + value + go()">
Bu durumda
, $ scope.foo ({MyVal: 42}) sonucunu döndürür: Esasen
42 + $parent.value + $parent.go()
, bu desen yönergesi "enjekte" değişkenleri direktifin tüketici can buna izin verir isteğe bağlı olarak foo ifadesinde kullanın.
<my-component foo="go">
ve yönergede:
Bunu yapabilirsiniz
$scope.foo()(42)
$ scope.foo() ifadesini değerlendirecek $ bir başvuru döndürür olan "go" parent.go işlevi. Daha sonra $ parent.go olarak adlandırılacaktır (42). Bu desenin olumsuz tarafı, ifadenin bir işlevi değerlendirmemesi durumunda bir hata alacağınızdır.
Aşağı oylamanın son nedeni, ng-event yönergelerinin & kullandığı iddiasıdır. Bu durum böyle değil.
$scope.foo = function(locals) {
return $parse(attr.foo)($scope.$parent, locals);
}
ng tıklama uygulanmasıdır:
scope:{
}
(netlik için basitleştirilmiş) olan '& foo' uygulanması, aşağı kaynar: direktifleri inşa hiçbiri ile izole kapsamları oluşturmak benzer fakat (aynı zamanda basitleştirilmiş):
link: function(scope, elem, attr) {
elem.on('click', function(evt) {
$parse(attr.ngClick)(scope, {
$event: evt
}
});
}
Yani hatırlamak için anahtar kullandığınızda '&', bir functio geçen olmamasıdır n - bir ifade iletiyorsunuz. Yönerge, üretilen ifadeyi çağırmak suretiyle bu ifadenin sonucunu herhangi bir zamanda alabilir.
Bu konuyla ilgili yanlış bir şey göremiyorum, ancak bir servise başvurmayı düşünebilirsiniz. – Mosho
Kararsızım, çünkü veri modeli için 2 yönlü bağlanma tasarlanmış gibi görünüyor, ancak bunu bir işlevde kullanıyorum. Genel olarak, bu işlevlerin yine de değiştirilmesi beklenmemektedir. –