2012-09-06 5 views
131

Mam zdarzenia click, co dzieje się poza zakresem mojego dyrektywy niestandardowej, więc zamiast używać „NG-kliknij” atrybut, używam jQuery.click (słuchacza) i wywołanie funkcji w moim zakresie tak:Jak mogę powiedzieć angularjs do „odświeżenia”

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

close() to prosta funkcja, która wygląda następująco:

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

moim zdaniem mam element z "nG-show" bound to isOpen w ten sposób:

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

Gdy debugowanie, jestem stwierdzenia, że ​​Close() jest wywoływana, ISOpen jest aktualizowany na false, ale widok angularjs nie aktualizuje. Czy jest sposób, który mogę ręcznie powiedzieć Angular, aby zaktualizować widok? Czy istnieje bardziej "kątowe" podejście do rozwiązania tego problemu, którego nie widzę?

Odpowiedz

243

Rozwiązaniem było nazwać ...

$scope.$apply(); 

... w moim zdarzenia jQuery zwrotnego.

+9

Ten link będzie pomocny, jak sądzę. http://jimhoskins.com/2012/12/17/angularjs-and-apply.html – sorx00

+6

nie powinno to być '$ scope. $ Apply();'? – ErichBSchulz

+0

Możesz użyć zarówno zakresu, jak i zakresu, to tylko różnica w zapisie, ale powoduje to samo. – user1226868

10

Zastosowanie

$route.reload(); 

pamiętać, aby wstrzyknąć $route do kontrolera.

+1

Ponadto, używając routera ui, należy użyć '$ state.reload()' –

12

Dlaczego $apply powinna nazywać?

TL; DR: $apply powinna zostać wywołana, gdy chcesz zastosować zmiany wprowadzone poza kątowego świata.


Wystarczy zaktualizować @Dustin's answer, tutaj jest wyjaśnienie co$apply dokładnie robi i dlaczego to działa.

$apply() służy do wykonywania wyraz w angularjs z zewnątrz ramowej angularjs. (Na przykład z zdarzeń DOM przeglądarki, setTimeout, XHR lub bibliotek stron trzecich). Dlatego wzywamy do ramach angularjs musimy wykonać prawidłowego cyklu życia zakres exception handling, executing watches.

Angular umożliwia użycie dowolnej wartości jako celu wiązania. Następnie na końcu każdego zwrotu kodu JavaScript sprawdza, czy wartość się zmieniła. To krok, który sprawdza, czy wszystkie wartości wiążące zmieniły faktycznie ma metodę, $scope.$digest()1. Prawie nigdy nie nazywamy tego bezpośrednio, ponieważ używamy zamiast tego $scope.$apply() (która będzie wywoływać $scope.$digest).

kątowa monitoruje tylko zmienne używane w wyrażeniach i wszystko wewnątrz $watch żyjącego wewnątrz zakresu.Jeśli więc zmienisz model poza kontekstem Angular, będziesz musiał wywołać $scope.$apply(), aby te zmiany były propagowane, w przeciwnym razie Angular nie będzie wiedział, że zostały zmienione, więc wiązanie nie zostanie zaktualizowane 2.

+1

Doceń odpowiedzi z objaśnieniami. Dziękuję Ci. – cheshireoctopus