С технической точки зрения у вас есть хорошее решение. Если вы хотите лучшего дизайна, то войдите в мир реактивного программирования.
Вместо ручного запуска проверки вы можете использовать поток и позволить Angular выполнять работу:
export class MomentComponent implements OnInit {
pageLoaded: Moment;
timeFromNow: Observable<string>;
ngOnInit() {
this.pageLoaded = moment(new Date());
this.timeFromNow = interval(1000).pipe(
map(() => this.pageLoaded.fromNow()),
distinctUntilChanged()
);
}
}
interval
работает как setInterval
в вашем примере: оно выдает значение каждые 1000 мс. Затем мы заменим это значение временной строкой. Вот и все. Каждую секунду выдается новая строка времени. Я добавил distinctUntilChanged()
, чтобы новое значение выдавалось только тогда, когда оно отличается от старого.
В вашем шаблоне вы можете использовать поток, используя async
pipe:
template: `Page loaded: <span class="relativeTime">{{ timeFromNow | async}}</span>`
HTML будет обновляться при появлении новой строки времени. Нет ненужных проверок и расчетов. В качестве бонуса при использовании канала async
таймер автоматически отменяется, когда компонент уничтожается, и вы не создаете утечку памяти.
Вы можете проверить демо-версию .