倒计时计时器 Angular 2

11

我正在尝试为我的Ionic2应用程序制作一个倒计时器,问题是我之前使用的倒计时器方法只能显示剩余时间,而现在我需要创建像30:00分钟这样的倒计时。有更好的方法吗?时间可能会改变,如果我想要在倒计时结束时触发某些操作,我只需比较time是否为0,对吧?

3个回答

42
你可以“监听”计时器,在倒计时为0时触发操作。使用管道来显示计时器。 HTML
{{counter | formatTime}}    

TypeScript

->

TypeScript

(无需翻译)
  countDown:Subscription;
  counter = 1800;
  tick = 1000;
  ngOnInit() {
    this.countDown = timer(0, this.tick)
      .subscribe(() => --this.counter)
  }
  ngOnDestroy(){
    this.countDown=null;
  }

管道

//for MM:SS format
  transform(value: number): string {
    const minutes: number = Math.floor(value / 60);
    return ('00' + minutes).slice(-2) + ':' + ('00' + Math.floor(value - minutes * 60)).slice(-2);
  }

演示

//for HH:MM:SS format

transform(value: number): string {
    const hours: number = Math.floor(value / 3600);
    const minutes: number = Math.floor((value % 3600) / 60);
    return ('00' + hours).slice(-2) + ':' + ('00' + minutes).slice(-2) + ':' + ('00' + Math.floor(value - minutes * 60)).slice(-2);
}

演示


如果您想使用服务:

服务

 ...
  getCounter(tick) {
    return timer(0, tick) 
  }
 ...
组件
  countDown;
  counter=1800 ;
  tick=1000;

  constructor(private myService: MyService) {
  }

  ngOnInit() {
    this.countDown = this.myService.getCounter(this.tick).subscribe(() => this.counter--);

  }

  ngOnDestroy(){
    this.countDown=null;
  }

管道

  ...  
  transform(value: number): string {
    //MM:SS format
    const minutes: number = Math.floor(value / 60);
    return ('00' + minutes).slice(-2) + ':' + ('00' + Math.floor(value - minutes * 60)).slice(-2);

    // for HH:MM:SS
    //const hours: number = Math.floor(value / 3600);
    //const minutes: number = Math.floor((value % 3600) / 60);
    //return ('00' + hours).slice(-2) + ':' + ('00' + minutes).slice(-2) + ':' + ('00' + Math.floor(value - minutes * 60)).slice(-2);

  }

演示


这是我链接答案的相同代码,对吗?如果我想要30:00,用这个代码行不行? - StuartDTO
我可以将它放在一个服务上,然后将其同步到我的页面上吗? - StuartDTO
如果您将其放入服务中,请订阅此服务。 - Vega
1
这就是我最终做到的方式,太棒了,你真厉害!感谢你的努力! - StuartDTO
1
非常感谢您提供的解决方案!这正是我正在寻找的东西。但是您能否在map函数的帖子中删除多余的“}”?我花了很多时间才弄清楚我的错误。@Vega - Oswald
显示剩余24条评论

2

尝试使用这个计时器:

<h5><span id="time" class="text-primary">00:00</span></h5>

component.ts

import { Component, OnInit, ElementRef, AfterViewInit } from '@angular/core';
import { Observable } from 'rxjs/Rx';

export class AppComponent implements OnInit {

    constructor(private elementRef: ElementRef) { }

    ngOnInit() {
        var callDuration = this.elementRef.nativeElement.querySelector('#time');
        this.startTimer(callDuration);
    }

    startTimer(display) {
        var timer = 1800;
        var minutes;
        var seconds;

        Observable.interval(1000).subscribe(x => {
            minutes = Math.floor(timer / 60);
            seconds = Math.floor(timer % 60);

            minutes = minutes < 10 ? "0" + minutes : minutes;
            seconds = seconds < 10 ? "0" + seconds : seconds;

            display.textContent = minutes + ":" + seconds;

            --timer;
            if (timer < 0) {
                 console.log('timer is ended');
            }
        })
    }
}

我会测试这个答案,以检查哪个更有效率,谢谢@Chandru,顺便问一下,如果我有一个API调用而不是“timer”,它返回remainingTime:1244.529,使用您的选项是否可能做到这一点? - StuartDTO
是的,可以使用这段代码实现。将remainingTime设置为1244.529而不是“timer”,然后计时器将以20.44开始。 - Chandru
如果我将此代码放在服务上,它能够更新视图吗?我的意思是倒计时正在运行,但如果我进行 API 调用并返回不同的 remainingTime,则必须更新它,这是可能的吗? - StuartDTO
如果你想帮我解决这个问题,请访问这个问题链接 - StuartDTO
Chandru,有了你的回答,我可以在服务中使用observable的内容,在页面上获取值?我的意思是服务拥有observable,而页面上有“计时器”(在你的代码中)? - StuartDTO
显示剩余2条评论

0
maxtime: any=30

  StartTimer(){
    this.timer = setTimeout(x => 
      {
          if(this.maxTime <= 0) { }
          this.maxTime -= 1;

          if(this.maxTime>0){
            this.hidevalue = false;
            this.StartTimer();
          }

          else{
              this.hidevalue = true;
          }

      }, 1000);


  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接