gpt4 book ai didi

Angular 2 - 倒数计时器

转载 作者:太空狗 更新时间:2023-10-29 17:01:59 26 4
gpt4 key购买 nike

我愿意在 Angular 2 中做一个从 60(即 59、58、57 等...)开始的倒数计时器

为此,我有以下内容:

constructor(){
Observable.timer(0,1000).subscribe(timer=>{
this.counter = timer;
});
}

以上,每秒滴答作响,这很好;但是,它按升序排列到无限数量。我不确定是否有办法调整它以便我可以有一个倒数计时器。

最佳答案

有很多方法可以实现这一点,一个基本的例子是使用take操作符

import { Observable, timer } from 'rxjs';
import { take, map } from 'rxjs/operators';

@Component({
selector: 'my-app',
template: `<h2>{{counter$ | async}}</h2>`
})
export class App {
counter$: Observable<number>;
count = 60;

constructor() {
this.counter$ = timer(0,1000).pipe(
take(this.count),
map(() => --this.count)
);
}
}

更好的方法是创建一个计数器指令!

import { Directive, Input, Output, EventEmitter, OnChanges, OnDestroy } from '@angular/core';

import { Subject, Observable, Subscription, timer } from 'rxjs';
import { switchMap, take, tap } from 'rxjs/operators';

@Directive({
selector: '[counter]'
})
export class CounterDirective implements OnChanges, OnDestroy {

private _counterSource$ = new Subject<any>();
private _subscription = Subscription.EMPTY;

@Input() counter: number;
@Input() interval: number;
@Output() value = new EventEmitter<number>();

constructor() {

this._subscription = this._counterSource$.pipe(
switchMap(({ interval, count }) =>
timer(0, interval).pipe(
take(count),
tap(() => this.value.emit(--count))
)
)
).subscribe();
}

ngOnChanges() {
this._counterSource$.next({ count: this.counter, interval: this.interval });
}

ngOnDestroy() {
this._subscription.unsubscribe();
}

}

用法:

<ng-container [counter]="60" [interval]="1000" (value)="count = $event">
<span> {{ count }} </span>
</ng-container>

这是一个直播 stackblitz

关于Angular 2 - 倒数计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44489580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com