#javascript #typescript
#javascript #typescript
Вопрос:
Я пытаюсь создать js-компонент обратного отсчета в typescript и получаю следующее.
Я хотел бы при каждом тике вызывать событие с оставшимся обратным отсчетом.
Я использую vs 2017, если это имеет значение.
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, чтобы присвоить ей дату, и каждую секунду она вызывает событие с оставшимся временем, оттуда я могу присваивать различные значения для дней, часов, минут и секунд соответствующим элементам.
Комментарии:
1. С какой проблемой вы столкнулись?
2. Я не знаю, как вызвать событие из моего класса
Ответ №1:
Если я понял ваш вопрос, вы хотите выдать событие, есть много способов сделать это… Вы можете использовать сторонний источник событий или создать basic самостоятельно… Вы также можете создать что-то, напоминающее отправитель событий, примерно так…
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);
Вот демонстрация:https://stackblitz.com/edit/typescript-awx9gy?file=index.ts
OP: Есть ли причина, по которой я предпочел бы третью сторону этому?
-
Одновременно у вас может быть только один прослушиватель, что
countDown.onCountDown = x => console.log("from first", x); countDown.onCountDown = x => console.log("from second", x);
означает, что это не сработает… Вы увидите только «со второго», поскольку оно переопределяет первое. На самом деле это даже не источник событий… Это своего рода замаскированный обратный вызов…countDown.on("countDown", x => console.log(x))
является источником события, потому что оно регистрирует прослушиватель вместо переопределения… -
Обычно люди больше знакомы с
foo.on("bar", x => console.log(x))
илиfoo.addEventListener("bar", x => console.log(x))
Тем не менее, не должно возникнуть проблем с использованием этого, если вы создаете свою собственную крошечную вещь, над которой работаете или будете использовать только вы… Однако, чтобы преодолеть 1-ю причину, вы все равно могли бы реализовать что-то такое простое, как это
Комментарии:
1. это именно то, что я хотел, класс с источником событий, так что это идеально, спасибо. Есть ли причина, по которой я предпочел бы третью сторону этому?
2. @Zoinky Всегда пожалуйста! 😀 Я ответил на ваш вопрос в самом сообщении, потому что оно немного длинное xD
3. очень круто, допустим, я хочу сделать .on («bar») что я должен изменить во втором примере? извините за все вопросы, не так много сделал js с точки зрения повышения событий и так далее. Я добавляю второе событие, которое возникает, когда таймер равен <= 0 stackblitz.com/edit/typescript-ppehvs?file=index.ts
4. Вы можете сделать что-то вроде этого … Это довольно типобезопасно, но я бы предложил использовать что-то вроде этой библиотеки