Mam zdarzenie kliknięcia, które ma miejsce poza zakresem mojej niestandardowej dyrektywy, więc zamiast używać atrybutu „ng-click”, używam odbiornika jQuery.click () i wywołuję funkcję w moim zakresie w następujący sposób:
$('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” powiązany z isOpen w następujący sposób:
<div ng-show="isOpen">My Div</div>
Podczas debugowania stwierdzam, że wywoływana jest metoda close (), isOpen jest aktualizowana do wartości false, ale widok AngularJS nie jest aktualizowany. Czy istnieje sposób, w jaki mogę ręcznie powiedzieć Angularowi, aby zaktualizował widok? Czy może jest bardziej „kątowe” podejście do rozwiązania tego problemu, którego nie widzę?
źródło
$scope.$apply();
?Dlaczego
$apply
należy zadzwonić?TL; DR :
$apply
powinno być wywoływane za każdym razem, gdy chcesz zastosować zmiany dokonane poza światem Angular.Aby zaktualizować odpowiedź @ Dustina , oto wyjaśnienie, co dokładnie robi $ apply i dlaczego działa.
Angular umożliwia użycie dowolnej wartości jako celu powiązania. Następnie na końcu każdej tury kodu JavaScript sprawdza, czy wartość uległa zmianie. Ten krok, który sprawdza, czy w rzeczywistości zmieniły się jakiekolwiek wiążące wartości, ma metodę
$scope.$digest()
1 . Prawie nigdy nie wywołujemy tego bezpośrednio, ponieważ używamy$scope.$apply()
zamiast tego (co zadzwoni$scope.$digest
).Angular monitoruje tylko zmienne używane w wyrażeniach i wszystko, co
$watch
żyje wewnątrz zakresu. Jeśli więc zmieniasz model poza kontekstem Angular, będziesz musiał wywołać$scope.$apply()
propagację tych zmian, w przeciwnym razie Angular nie będzie wiedział, że zostały zmienione, więc powiązanie nie zostanie zaktualizowane 2 .źródło
Posługiwać się
pamiętaj, aby wstrzyknąć
$route
do kontrolera.źródło
$state.reload()