Eu tenho um evento click que acontece fora do escopo da minha diretiva personalizada. Portanto, em vez de usar o atributo "ng-click", estou usando um ouvinte jQuery.click () e chamando uma função dentro do meu escopo da seguinte maneira:
$('html').click(function(e) {
scope.close();
);
close () é uma função simples que se parece com isso:
scope.close = function() {
scope.isOpen = false;
}
Na minha opinião, eu tenho um elemento com "ng-show" vinculado a isOpen assim:
<div ng-show="isOpen">My Div</div>
Ao depurar, estou descobrindo que close () está sendo chamado, isOpen está sendo atualizado para false, mas a exibição do AngularJS não está sendo atualizada. Existe uma maneira de dizer manualmente ao Angular para atualizar a exibição? Ou existe uma abordagem mais "angular" para resolver esse problema que não estou vendo?
fonte
$scope.$apply();
?Por que
$apply
deveria ser chamado?TL; DR :
$apply
deve ser chamado sempre que você desejar aplicar alterações feitas fora do mundo Angular.Apenas para atualizar a resposta de @ Dustin , aqui está uma explicação do que $ apply exatamente faz e por que funciona.
Angular permite que qualquer valor seja usado como um destino de ligação. Em seguida, ao final de qualquer turno do código JavaScript, ele verifica se o valor foi alterado. Essa etapa que verifica se algum valor de ligação foi alterado realmente possui um método,
$scope.$digest()
1 . Quase nunca chamamos isso diretamente, como usamos em$scope.$apply()
vez disso (que chamará$scope.$digest
).Angular monitora apenas variáveis usadas em expressões e qualquer coisa dentro de uma
$watch
vida dentro do escopo. Portanto, se você estiver alterando o modelo fora do contexto Angular, precisará solicitar$scope.$apply()
a propagação dessas alterações; caso contrário, o Angular não saberá que foram alteradas, portanto, a ligação não será atualizada 2 .fonte
Usar
lembre-se de injetar
$route
no seu controlador.fonte
$state.reload()