Estou tentando mostrar ou ocultar um indicador de carregamento em um botão quando uma solicitação está ocupada. Eu faço isso com o angular alterando a variável $ scope.loading quando uma solicitação está carregando ou quando termina de carregar.
$scope.login = function(){
$scope.loading = true;
apiFactory.getToken()
.success(function(data){
})
.error(function(error){
})
.finally(function(){
$timeout(function() {
$scope.loading = false;
}, 0);
});
};
No frontend:
<button ng-disabled="loading" class="button button-outline button-positive" type="submit">
Log in
<span ng-if="loading" class="ion-refreshing"></span>
</button>
Isso funciona bem, mas o ícone de carregamento (atualização de íons) é mostrado por cerca de 2 segundos, enquanto a variável $ scope é atualizada imediatamente. Eu tentei $ scope. $ Apply, mas não parece ser o que está errado aqui, o escopo é atualizado muito bem e imediatamente após a solicitação. É apenas o ícone que não está respondendo rápido o suficiente.
Obrigado por me ajudar a entender isso!
$scope
funções queng-if
usa para descobrir se os elementos relevantes devem ser mostrados. No entanto, os botõesng-if
permanecem incorretamente visíveis ou ocultos por alguns segundos. Depois de um curto período de tempo, todos os botões assumem seus estados visíveis / ocultos pretendidos. - Eu contornei isso usandong-hide
. Versão Angular 1.2.16.Respostas:
Tente remover o ngAnimate se você não o estiver usando na página de configuração e index.html do aplicativo:
@Spock; se você ainda precisar usar o ngAnimate, deixe a configuração do aplicativo intocada e apenas adicione o seguinte CSS:
Isso ocultará o ícone animado logo depois que sua condição for atendida.
Como você pode ver, estamos definindo .ng-hide-animate como oculto. Isso é o que causa o atraso enquanto espera a conclusão da animação. Você pode adicionar uma animação ao seu evento de ocultação como o nome da classe indica, em vez de ocultá-la como no exemplo acima.
fonte
ng-if
,ng-show
que era visivelmente lenta. Eu removingAnimate
e resolveu o problema para mim. Obrigado!ng-if
, adicionar apenas.ng-leave { display:none; }
ao elemento funcionou para mim (!important
não foi necessário).Eu tive o mesmo problema e resolvi isso usando ng-class com o nome de classe 'oculto' para ocultar o elemento em vez de usar ng-if ou ng-show / ng-hide.
fonte
null
(que fica por alguns segundos esperando a chamada da API), portanto, dois elementos select são exibidos rapidamente. Então você não está usandong-if
nada? Obrigado.Encontrei algumas soluções aqui , mas o melhor para mim foi substituir o estilo da classe .ng-animate:
Em html:
Este é um exemplo: http://jsfiddle.net/9krLr/27/
Espero te ajudar.
fonte
Eu estava enfrentando um problema semelhante, costumava
$scope.$evalAsync()
forçar a atualização do vínculo.Ele funciona como um encanto.
Evite usar
$scope.$apply
, pois pode entrar em conflito com uma fase $ digest já em execução.fonte
Eu tive o mesmo problema ao usar
No meu caso, resolvi isso adicionando uma classe:
e, em seguida, adicionar a classe condicionalmente em vez de usar
*ngIf
:Se sempre usar dessa forma, consideraria renomear
shouldShow
parashouldHide
(e negar a lógica que o atribui), para que possa ser usado como emshouldHide
vez de!shouldShow
.Se você tiver
display: flex
em seu CSS para a classe existente do DIV, essa propriedade de exibição pode ter precedência sobre odisplay: hidden
. Uma solução fácil pode ser usar emdisplay: none !important
vez disso, mas geralmente há soluções melhores para garantir a precedência de outras maneiras. Aqui está uma boa leitura sobre alternativas .fonte
na versão angular 1.5.x adicionando
$scope.$apply()
após a mudança na condição fez o trabalho para mim aqui está uma função de exemplofonte