解释
无需创建单独的控制器、指令或更改任何业务逻辑。只需使用.animation
方法将条件动画添加到.slide
.
在 上收听$routeChangeSuccess
事件$rootScope
。这是事件将在动画开始之前触发,因此您有时间相应地设置toRoot
和fromRoot
标记。如果目标视图不是"/" 视图,则会在元素中添加一个enable-animation
类ng-view
,因此将执行定义的 css 转换。
如果目标视图是“/”视图,则不会执行动画。
HTML
<ng-view class="slide"></ng-view>
CSS
.slide {
position: absolute;
top: 0;
width: 100%;
}
.slide div {
margin: 10px;
background: red;
}
.slide.enable-animation.ng-enter,
.slide.enable-animation.ng-leave {
transition: all 10s;
z-index: 1;
}
.slide.enable-animation.ng-enter {
left: -100%;
opacity: 0;
}
.slide.enable-animation.ng-enter.ng-enter-active,
.slide.enable-animation.ng-leave {
left: 0;
opacity: 1;
}
.slide.enable-animation.ng-leave.ng-leave-active {
left: 100%;
opacity: 0;
}
JavaScript
app.animation('.slide', function($rootScope, $animate) {
var toRoot = false;
var fromRoot = false;
$rootScope.$on('$routeChangeSuccess', function(event, current, old) {
toRoot = (current.$$route.originalPath === '/');
fromRoot = (old.$$route.originalPath === '/');
});
return {
enter: function(element, done) {
if (!toRoot) {
element.addClass('enable-animation');
}
done();
},
leave: function(element, done) {
if (!fromRoot) {
element.addClass('enable-animation');
done();
} else {
// set 1000ms timeout to sync with CSS animation
// otherwise leaving ng-view element will be removed before entering ng-view is in position
setTimeout(done, 1000);
}
}
}
});
更新 1
如果您只想在第一次加载应用程序时排除路由,您基本上不必做任何事情,只需像平常一样定义您的 css 动画。第一个加载的路线不会触发任何动画。