angular度ng-if或ng-show响应慢(2秒延迟?)
当请求忙时,我试图在button上显示或隐藏加载指示器。 我通过更改$ scope.loadingvariables在加载请求或加载完成时使用angular来实现。
$scope.login = function(){ $scope.loading = true; apiFactory.getToken() .success(function(data){ }) .error(function(error){ }) .finally(function(){ $timeout(function() { $scope.loading = false; }, 0); }); };
在前端:
<button ng-disabled="loading" class="button button-outline button-positive" type="submit"> Log in <span ng-if="loading" class="ion-refreshing"></span> </button>
这工作正常,但加载图标(离子刷新)显示约2秒,而$ scopevariables立即更新。 我试过$ scope。$ apply,但是这似乎并不是什么问题,范围在请求之后立即更新。 这只是图标没有足够快的响应。
感谢帮助我理解这一点!
尝试删除ngAnimate,如果你不是从你的应用程序configuration和index.html页面使用它:
angular.module('myApp', [...'ngAnimate',...])
@Spock; 如果您仍然需要使用ngAnimate,请保持您的应用程序configuration不变,只需添加以下CSS:
.ng-hide.ng-hide-animate{ display: none !important; }
这会在满足条件后直接隐藏animation图标。
正如你所看到的,我们正在设置.ng-hide-animate隐藏。 这是等待animation完成的原因。 您可以将animation添加到隐藏事件中,因为类名隐含而不是隐藏它,如上例所示。
我遇到了同样的问题,通过使用带有“隐藏”类名的ng-class来隐藏元素,而不是使用ng-if或者ng-show / ng-hide。
我在这里find了一些解决scheme,但对我来说最好的是重写.ng-animate类的样式:
.ng-animate.no-animate { transition: 0s none; -webkit-transition: 0s none; animation: 0s none; -webkit-animation: 0s none; }
在html中:
<button ng-disabled="loading" class="button button-outline button-positive" type="submit"> Log in <span ng-if="loading" class="ion-refreshing no-animate"></span> </button>
这是一个例子: http : //jsfiddle.net/9krLr/27/
我希望能帮助你。
我遇到了类似的问题,我用$scope.$evalAsync()
来强制更新绑定。
它像一个魅力。
避免使用$scope.$apply
因为它可能与已经运行的$ digest阶段冲突。
if(selectedStatistics.length === 0 || selectedWorkgroups.length === 0){ ctrl.isSaveDisabled = true; $scope.$evalAsync(); } else{ ctrl.isSaveDisabled = false; $scope.$evalAsync(); }
在angular度版本1.5.x中添加$scope.$apply()
在条件改变之后,对于我来说做的工作就是一个示例函数
$scope.addSample = function(PDF) { var validTypes ="application/pdf"; if(PDF.type == validTypes) { //checking if the type is Pdf and only pdf $scope.samplePDF= PDF.files[0]; $scope.validError = false; $scope.$apply(); } else { $scope.validError = true; $scope.samplePDF= null; $scope.$apply(); } }