javascript - examples - angularjs tutorial
¿Cómo puedo decirle a AngularJS que "actualice" (3)
Tengo un evento de clic que ocurre fuera del alcance de mi directiva personalizada, así que en lugar de usar el atributo "ng-click", estoy usando un oyente jQuery.click () y estoy llamando a una función dentro de mi ámbito de la siguiente manera:
$(''html'').click(function(e) {
scope.close();
);
close () es una función simple que se ve así:
scope.close = function() {
scope.isOpen = false;
}
En mi opinión, tengo un elemento con "ng-show" vinculado a isOpen como este:
<div ng-show="isOpen">My Div</div>
Al depurar, encuentro que se llama a close (), isOpen se está actualizando a falso, pero la vista de AngularJS no se está actualizando. ¿Hay alguna manera de decirle manualmente a Angular que actualice la vista? ¿O hay un enfoque más "angular" para resolver este problema que no estoy viendo?
¿Por qué se debe llamar $apply
?
Se debe llamar a TL; DR : $apply
cada vez que desee aplicar cambios realizados fuera del mundo angular.
Solo para actualizar la respuesta de @Dustin , aquí hay una explicación de lo que $apply hace exactamente y por qué funciona.
$apply()
se usa para ejecutar una expresión en AngularJS desde fuera del framework AngularJS. (Por ejemplo, desde los eventos DOM del navegador, setTimeout, XHR o bibliotecas de terceros). Como llamamos al marco de AngularJS, debemos llevar a cabo un ciclo de vida de alcance adecuado para el manejo de excepciones , ejecutando relojes .
Angular permite que cualquier valor sea utilizado como un objetivo vinculante. Luego, al final de cualquier código JavaScript, verifica si el valor ha cambiado. El paso que verifica si los valores de enlace han cambiado realmente tiene un método, $scope.$digest()
jimhoskins.com/2012/12/17/angularjs-and-apply.html . Casi nunca lo llamamos directamente, ya que usamos $scope.$apply()
lugar (que llamará $scope.$digest
).
Angular solo monitorea variables usadas en expresiones y cualquier cosa dentro de un $watch
viva dentro del alcance. Por lo tanto, si está cambiando el modelo fuera del contexto angular, necesitará llamar a $scope.$apply()
para que esos cambios se propaguen; de lo contrario, Angular no sabrá que se han modificado, por lo tanto, el enlace no se actualizará 2 .
La solución fue llamar ...
$scope.$apply();
... en mi devolución de llamada al evento jQuery.
Utilizar
$route.reload();
recuerde inyectar $route
a su controlador.