在我的AngularJS应用程序中,我使用fontawesome作为我的装载旋转器:
<i class="fa fa-spin fa-spinner" ng-show="loading"></i>
我还使用AngularToaster获取依赖于ngAnimate的通知消息。当我在我的AngularJS应用程序中包含ngAnimate时,它通过以奇怪的方式设置动画来扰乱我的加载旋转器。我想阻止这种情况发生,但是无法找到一种方法来禁用这些加载器上的动画(它也很臭,必须更新我的应用程序中的每个加载器)。
看到一个傻瓜显示我的确切问题。
答案 0 :(得分:59)
我认为最好的方法是使用$animateProvider.classNameFilter
,它允许您过滤动画的项目,或者在这种情况下不动画。我们会做类似的事情:
$animateProvider.classNameFilter(/^((?!(fa-spinner)).)*$/);
//$animateProvider.classNameFilter(/^((?!(fa-spinner|class2|class3)).)*$/);
演示:
http://plnkr.co/edit/lbqviQ87MQoZWeXplax1?p=preview
Angular docs州:
设置和/或返回已检查的CSS类正则表达式 在执行动画时。在bootstrap上运行classNameFilter值 根本没有设置,因此将启用$ animate尝试 对任何元素执行动画。设置classNameFilter时 值,动画将仅对成功的元素执行 匹配过滤器表达式。这反过来可以提高性能 低功耗设备以及包含大量应用程序的应用程序 结构运作。
作为使用no-animate
指令的注释的另一个答案,您可以编写将以更高优先级运行的ng-show
指令并禁用动画。我们只会在元素具有fa-spinner
类时执行此操作。
problemApp.directive('ngShow', function($compile, $animate) {
return {
priority: 1000,
link: function(scope, element, attrs) {
if (element.hasClass('fa-spinner')) {
// we could add no-animate and $compile per
// http://stackoverflow.com/questions/23879654/angularjs-exclude-certain-elements-from-animations?rq=1
// or we can just include that no-animate directive's code here
$animate.enabled(false, element)
scope.$watch(function() {
$animate.enabled(false, element)
})
}
}
}
});
演示:http://plnkr.co/edit/BYrhEompZAF5RKxU7ifJ?p=preview
最后,与上面类似,如果我们想让它更加模块化,我们可以使用no-animate
指令。在这种情况下,我正在命名你可以在上面的答案中做的指令faSpin
。这基本上只是我们保留上述代码集注释中提到的SO答案的指令。如果您只关心以这种方式命名的fa-spin
动画问题,那么如果您有其他ng-show
动画问题,则需要将其命名为ngShow
并添加到if子句
problemApp.directive('noAnimate', ['$animate',
function($animate) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
$animate.enabled(false, element)
scope.$watch(function() {
$animate.enabled(false, element)
})
}
};
}
])
problemApp.directive('faSpin', function($compile, $animate) {
return {
priority: 1000,
link: function(scope, element, attrs) {
if (element.hasClass('fa-spinner')) {
element.attr('no-animate', true);
$compile(element)(scope);
}
}
}
});
答案 1 :(得分:38)
我有一个类似的问题,即使在关闭$ scope变量之后,我的图标会一直旋转直到动画结束。对我有用的是将Cursor cursor=arg0.getItemAtPosition(position);
Expence row ;
if (cursor.moveToFirst()) {
do {
// do what you need with the cursor here
row=new Expence(<ID>);
row.setCategory(cursor.getString(cursor.getColumnIndex("Category")));
... Do same for other
} while (cursor.moveToNext());
}
fa-icon元素包装在一个范围内。
<i>
试试吧!
答案 2 :(得分:18)
我找到了一种更简单的方法。
<i class="fa fa-spinner" ng-show="loading" ng-class="{'fa-spin' : loading}"></i>
Forked plunker:http://plnkr.co/edit/mCsw5wBL1bsLYB7dCtQF
我确实遇到了另一个小问题,因为如果旋转超过2秒,图标就会显得不合适,但这是由'ng-hide-add-active'类引起的,所以我刚加入我的CSS:
.fa-spinner.ng-hide-add-active {
display: none !important;
}
并且照顾它。
编辑:Nico的解决方案是一个稍微清晰的版本,所以我考虑使用他的。答案 3 :(得分:3)
angular.module('myCoolAppThatIsAwesomeAndGreat')
.config(function($animateProvider) {
// ignore animations for any element with class `ng-animate-disabled`
$animateProvider.classNameFilter(/^((?!(ng-animate-disabled)).)*$/);
});
然后,您可以将类ng-animate-disabled
添加到您想要的任何元素。
<button><i class="fa fa-spinner ng-animate-disabled" ng-show="somethingTrue"></i></button>
答案 4 :(得分:0)
<i class="fa fa-spinner fa-spin" ng-show="loading"></i>
您不需要@James Fiala答案中提到的ng-class
。但是你应该将fa-spin
作为其中一个。
.fa-spinner.ng-hide-add-active {
display: none !important;
}