Javascript Typescript类引发事件

Javascript Typescript类引发事件,javascript,typescript,Javascript,Typescript,我正在尝试在typescript中创建一个倒计时js组件,并具有以下功能 我想在每一个刻度上提出一个事件,剩余的倒计时 如果重要的话,我会使用VS2017 export class DateCountDown { constructor(date: any) { this.startCountDown(date); } startCountDown(date: any) { const thousand = 1000; con

我正在尝试在typescript中创建一个倒计时js组件,并具有以下功能

我想在每一个刻度上提出一个事件,剩余的倒计时

如果重要的话,我会使用VS2017

export class DateCountDown {

   constructor(date: any) {

     this.startCountDown(date);

   }   

   startCountDown(date: any) {
       const thousand = 1000;
       const sixty = 60;
       const twentyfour = 24;

       setInterval(() => {
           const now = new Date().getTime();
           const t = date - now;

           const days = Math.floor(t / (thousand * sixty * sixty * twentyfour));
           const hours = Math.floor((t % (thousand * sixty * sixty * twentyfour)) / (thousand * sixty * sixty));
           const minutes = Math.floor((t % (thousand * sixty * sixty)) / (thousand * sixty));
           const seconds = Math.floor((t % (thousand * sixty)) / thousand);

         //Raise the event with above values
       }, 1000);
}
}

如果在一个事件中提升多个值并不理想,那么我创建了一个类来存储该值,然后提升该值

export class CountDownValues {
    daysLeft: number;
    hoursLeft: number;
    minutesLeft: number;
    secondsLeft: number;
    constructor(days: number, hours: number, minutes: number, seconds: number) {
        this.daysLeft = days;
        this.hoursLeft = hours;
        this.minutesLeft = minutes;
        this.secondsLeft = seconds;
    }
    public get days(): number {
        return this.daysLeft;
    }
    public get hours(): number {
        return this.hoursLeft;
    }
    public get minutes(): number {
        return this.minutesLeft;
    }
    public get seconds(): number {
        return this.secondsLeft;
    }
}

我只是想创建一个基本的js库/组件,我给它一个日期,每秒钟它都会引发一个剩余时间的事件,从那里我可以为相应的元素分配不同的天、小时、分钟和秒值。

如果你已经理解了你的问题,你想发出一个事件,有很多方法可以做到这一点。。。您可以使用第三方事件发射器或自己创建基本事件发射器。。。你也可以做一些类似于事件发射器的东西,像这样

class CountDownValues {
  daysLeft: number;
  hoursLeft: number;
  minutesLeft: number;
  secondsLeft: number;
  constructor(days: number, hours: number, minutes: number, seconds: number) {
    this.daysLeft = days;
    this.hoursLeft = hours;
    this.minutesLeft = minutes;
    this.secondsLeft = seconds;
  }
  public get days(): number {
    return this.daysLeft;
  }
  public get hours(): number {
    return this.hoursLeft;
  }
  public get minutes(): number {
    return this.minutesLeft;
  }
  public get seconds(): number {
    return this.secondsLeft;
  }
}

class DateCountDown {
  onCountDown: (values: CountDownValues) => void;

  constructor(date: Date) {
    this.startCountDown(date);
    this.onCountDown = () => {};
  }

  startCountDown(date: Date) {
    const thousand = 1000;
    const sixty = 60;
    const twentyfour = 24;

    setInterval(() => {
      const now = new Date().getTime();
      const t = date.valueOf() - now;

      const days = Math.floor(t / (thousand * sixty * sixty * twentyfour));
      const hours = Math.floor((t % (thousand * sixty * sixty * twentyfour)) / (thousand * sixty * sixty));
      const minutes = Math.floor((t % (thousand * sixty * sixty)) / (thousand * sixty));
      const seconds = Math.floor((t % (thousand * sixty)) / thousand);

      if (this.onCountDown) {
        this.onCountDown(new CountDownValues(days, hours, minutes, seconds))
      }
    }, 1000);
  }
}

let countDown = new DateCountDown(new Date());
countDown.onCountDown = values => console.log(values);
下面是一个演示:

OP:为什么我更喜欢第三方而不是这个

  • 一次只能有一个侦听器,这意味着
    countDown.onCountDown=x=>console.log(“从第一个开始”,x);countDown.onCountDown=x=>console.log(“从第二秒开始”,x)不起作用。。。当“从第二个”覆盖第一个时,您将只看到“从第二个”。实际上它甚至不是一个事件发射器。。。这有点像是伪装的回调
    countDown.on(“countDown”,x=>console.log(x))
    是一个事件发射器,因为它注册侦听器而不是重写

  • 人们通常更熟悉
    foo.on(“bar”,x=>console.log(x))
    foo.addEventListener(“bar”,x=>console.log(x))


  • 然而,如果你正在制作你自己的小东西,而只有你在制作或将要使用它,那么使用它应该没有问题。。。然而,为了克服第一个原因,您仍然可以实现一些简单的功能,如

    您遇到的问题是什么?我不知道如何从我的类中引发事件这正是我想要的,一个带有事件发射器的类,因此这非常完美,谢谢。我为什么更喜欢第三方而不是这个?@Zoinky不客气我已经在帖子中回答了你的问题,因为它有点长,很酷,比如说我想做.on(“bar”)在你的第二个例子中我需要做什么改变?抱歉所有的问题,没有做太多的js方面的筹款活动等。我添加了第二个事件,当计时器启动时引发,您可以执行以下操作。。。这是非常安全的类型,但我建议使用类似库的东西