AngularJS'ye “yenilemesini” nasıl söyleyebilirim


168

Benim özel yönergesi kapsamı dışında gerçekleşen bir tıklama olayı var, bu yüzden "ng-click" özniteliğini kullanmak yerine, bir jQuery.click () dinleyicisi kullanıyorum ve benim kapsam içinde böyle bir işlevi çağırıyorum:

$('html').click(function(e) {
  scope.close();
);

close (), şuna benzer basit bir işlevdir:

scope.close = function() {
  scope.isOpen = false;
}

Benim görüşüme göre, "ng-show" isOpen gibi bağlı bir öğe var:

<div ng-show="isOpen">My Div</div>

Hata ayıklama, close () çağrılıyor buluyorum, isOpen false olarak güncelleştiriliyor, ancak AngularJS görünümü güncelleştirilmiyor. Angular'a görünümü güncellemesini manuel olarak söylememin bir yolu var mı? Yoksa görmediğim bu problemi çözmek için daha "Açısal" bir yaklaşım var mı?

Yanıtlar:


315

Çözüm ...

$scope.$apply();

... jQuery etkinliği geri aramda.


9
Bu bağlantı yararlı olacak diye düşünüyorum. jimhoskins.com/2012/12/17/angularjs-and-apply.html
Roman Sklyarov

6
öyle değil $scope.$apply();mi?
ErichBSchulz

Hem $ kapsamı hem de kapsamı kullanabilirsiniz, bu sadece bir gösterim farkıdır, ancak aynı sonuç verir.
user1226868

4
@ErichBSchulz - Genellikle direktiflerde, $ ve kontrol cihazlarına enjekte edilen '$ kapsamı arasında ayrım yapabileceğine inandığım kapsam olmadan kullanılan kapsamı görüyorum. Kontrolörlerde, $ scope ile referans almak önemlidir, bu nedenle Angular enjekte edilecek bağımlılığın ne olduğunu bilir, ancak bir direktif bağlantı fonksiyonunda her zaman aynı 4 öğeyi sıra ile geçer ve belirli bir ad gerektirmez (kapsam, öğe, izinsiz girişler, kontrolör) ).
cchamberlain

30

Neden $applyçağrılmalı?

TL; DR : Açısal dünyanın dışında$apply yapılan değişiklikleri uygulamak istediğinizde çağrılmalıdır .


Sadece güncelleme Dustin'in cevap @ aşağıda bir açıklama olduğunu neyi $ uygulamak yapar tam olarak ve neden çalışır.

$apply()AngularJS içinde AngularJS çerçevesinin dışından bir ifade yürütmek için kullanılır. (Örneğin tarayıcı DOM olaylarından, setTimeout, XHR veya üçüncü taraf kitaplıklarından). AngularJS çerçevesini çağırdığımız için, istisna işleme , saatler yürütürken uygun kapsam yaşam döngüsünü gerçekleştirmemiz gerekiyor .

Açısal, herhangi bir değerin bağlayıcı bir hedef olarak kullanılmasına izin verir. Daha sonra herhangi bir JavaScript kodu dönüşünün sonunda, değerin değişip değişmediğini kontrol eder. Herhangi bir bağlayıcı değerin değişip değişmediğini kontrol eden bu adımın aslında bir yöntemi vardır, $scope.$digest()1 . $scope.$apply()Bunun yerine kullandığımız için neredeyse hiçbir zaman doğrudan doğrudan diyoruz $scope.$digest.

Açısal, yalnızca ifadelerde kullanılan değişkenleri $watchve kapsam içinde yaşayan bir şeyin içindeki her şeyi izler . Modeli Açısal bağlamın dışında değiştiriyorsanız, $scope.$apply()bu değişikliklerin yayılması için çağrıda bulunmanız gerekir , aksi takdirde Açısal bunların değiştirildiğini bilmeyecek, böylece bağlanma güncellenmeyecektir 2 .


14

kullanım

$route.reload();

$routekumandanıza enjekte etmeyi unutmayın.


5
Ayrıca, ui-router kullanırken, mutlaka kullanın$state.reload()
Jeffrey Roosendaal

Bu, ekran görüntüsü testlerimiz için süper yardımcı oldu! Devleti taklit ediyoruz, ancak bazen değişiklikleri izleyen izleyicilerimiz olmayabilir, bu da kafa karıştırıcı arızalara veya aralıklı arızalara neden olabilir. Ancak kapsamı bu şekilde yeniden yükleyebilmek, bununla mücadeleye yardımcı olur.
theblang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.