Как я могу сказать AngularJS "обновить",

У меня есть событие щелчка, которое происходит за пределами моей настраиваемой директивы, поэтому вместо использования атрибута "ng-click" я использую прослушиватель jQuery.click() и вызываю функцию внутри моей области следующим образом:

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

close() - простая функция, которая выглядит так:

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

На мой взгляд, у меня есть элемент с "ng-show", связанный с isOpen следующим образом:

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

При отладке я обнаруживаю, что вызывается функция close(), isOpen обновляется до false, но просмотр AngularJS не обновляется. Есть ли способ, который я могу вручную сообщить Angular, чтобы обновить представление? Или существует ли более "Angular" подход к решению этой проблемы, который я не вижу?

Ответ 1

Решение заключалось в вызове...

$scope.$apply();

... в моем обратном вызове события jQuery.

Ответ 2

Почему $apply должен быть вызван?

TL; DR: $apply следует вызывать всякий раз, когда вы хотите применить изменения, сделанные вне мира Angular.


Просто обновить @Dustin answer, вот объяснение того, что $apply точно и почему работает.

$apply() используется для выполнения выражения в AngularJS извне Рамка AngularJS. (Например, из событий браузера DOM, setTimeout, XHR или сторонние библиотеки). Потому что мы призываем Рамки AngularJS нам необходимо выполнить правильный жизненный цикл обработка исключений, выполнение часов.

Angular позволяет использовать любое значение в качестве цели привязки. Затем в конце любого кода JavaScript-кода он проверяет, изменилось ли значение. Этот шаг, который проверяет, изменили ли какие-либо значения привязки, имеет метод $scope.$digest() 1. Мы почти никогда не называем это напрямую, поскольку вместо этого мы используем $scope.$apply() (который вызовет $scope.$digest).

Angular контролирует только переменные, используемые в выражениях, и все внутри $watch, живущие внутри области. Поэтому, если вы меняете модель вне контекста Angular, вам нужно будет вызвать $scope.$apply() для тех изменений, которые будут распространяться, иначе Angular не будет знать, что они были изменены, поэтому привязка не будет обновлена ​​2.

Ответ 3

Используйте

$route.reload();

не забудьте ввести $route в контроллер.