这太糟糕了,对于 Angular 2+,但只是为了记录,这里有一个想法。
我有两个button
元素,一个是当用户的购物车中有商品时,一个是当他们没有时。
到目前为止,最简单的方法是放在position: relative
父 DIV 和position: absolute
两个按钮上。主要缺点是必须手动调整父 DIV 的大小,并且诸如居中之类的事情变得更加棘手。
如果意图是基于 Observable 值延迟添加到 DOM,那么我想'为什么不只是延迟 observable 值呢?' 这将具有相同的最终效果。仅当转换从 false > true 时才需要执行此操作,因为您只想在它出现时隐藏它。所以我用一个管道来处理这个。
<!-- This button for when item is IN the cart -->
<button [@cartIconAnimation] *ngIf="showCartIcon | delayTrue | async">View Cart</button>
<!-- This button for when item is NOT IN the cart -->
<button [@cartIconAnimation] *ngIf="showCartIcon | complement | delayTrue | async">Add to Cart</button>
这假设showCartIcon
是Observable<boolean>
。
然后管道如下,并且您的动画标准不需要延迟。
@Pipe({
name: 'delayTrue'
})
export class DelayTruePipe implements PipeTransform {
constructor() {}
transform(value: Observable<any> | any, delay: number): Observable<any> {
if (isObservable(value)) {
return value.pipe(distinctUntilChanged(), debounce((show) => show ? timer(delay || 500) : empty()));
} else {
throw Error('Needs to be an observable');
}
}
}
@Pipe({
name: 'complement'
})
export class ComplementPipe implements PipeTransform {
constructor() {}
transform(value: Observable<boolean> | any): Observable<any> {
if (isObservable(value)) {
return value.pipe(map(i => !i));
} else {
throw Error('Needs to be an observable');
}
}
}
注意:管道使用的延迟必须大于上一个项目消失的时间,否则你会遇到同样的问题。
补码管道只是反转布尔值。
This solution works, but it's hacky and the timing might be harder to get wrong and there may be race conditions as two different browser timers fire off at the same time. I'd only do something like this if you really can't use position: absolute
.