Angular 2 - 倒数计时器

Fol*_*y.H 13 countdown rxjs countdowntimer angular

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

为此,我有以下内容:

constructor(){
  Observable.timer(0,1000).subscribe(timer=>{
  this.counter = timer;
});
}
Run Code Online (Sandbox Code Playgroud)

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

Mur*_*sli 29

有很多方法可以实现这一点,一个基本的例子是使用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)
     );
   }
}
Run Code Online (Sandbox Code Playgroud)

这是一个活的plnkr

更新

更好的方法!创建一个反指令

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();
  }

}
Run Code Online (Sandbox Code Playgroud)

用法:

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

这是一个现场stackblitz