Пользовательские трубы | фильтр для расчета относительного времени в angular2
В процессе обучения я столкнулся с созданием Custom Pipe, поэтому подумал, что это поможет.
2 ответа
Решение
Ниже приведен код для пользовательского канала.
import{PipeTransform,Pipe} from '@angular/core';
@Pipe({
name:'relativeTime'
})
export class RelativeTimeFilterPipe implements PipeTransform{
transform(inputDate:string):string{
var current = new Date().valueOf();
var input = new Date(parseInt(inputDate)).valueOf();
var msPerMinute = 60 * 1000;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;
var elapsed = current - input;
if (elapsed < msPerMinute) {
return Math.round(elapsed / 1000) + ' seconds ago';
}
else if (elapsed < msPerHour) {
return Math.round(elapsed / msPerMinute) + ' minutes ago';
}
else if (elapsed < msPerDay) {
return Math.round(elapsed / msPerHour) + ' hours ago';
}
else if (elapsed < msPerMonth) {
return 'approximately ' + Math.round(elapsed / msPerDay) + ' days ago';
}
else if (elapsed < msPerYear) {
return 'approximately ' + Math.round(elapsed / msPerMonth) + ' months ago';
}
else {
console.log('inside the if condition', elapsed);
return 'approximately ' + Math.round(elapsed / msPerYear) + ' years ago';
}
}
}
Вот вам асинхронный канал относительной даты. Он обновляет относительное время, когда вы смотрите на экран, и это даже не грязная трубка, что делает его намного быстрее! Еще одна замечательная вещь заключается в том, что обновления относительного времени происходят одновременно с использованием планировщика cron.
import { OnDestroy, Pipe, PipeTransform } from '@angular/core'
import { timeAgo } from '../../../utils/date-utils'
import { BehaviorSubject } from 'rxjs'
import * as schedule from 'node-schedule'
@Pipe({name: 'timeAgo'})
export class TimeAgoPipe implements PipeTransform, OnDestroy {
sub: BehaviorSubject<string>
job: schedule.Job
date: Date
constructor() {
this.sub = new BehaviorSubject<string>(null)
this.job = schedule.scheduleJob('*/10 * * * * *', () => { // updates every 10 secs at 1:10 1:20 1:30 etc
if (this.date) this.sub.next(timeAgo(this.date))
})
}
transform(date: Date | number): BehaviorSubject<string> {
setTimeout(() => {
this.date = new Date(date)
this.sub.next(timeAgo(this.date))
})
return this.sub
}
ngOnDestroy(): void {
this.job.cancel()
}
}
использование шаблона выглядит так:
<span>{{ activity.date | timeAgo | async }}</span>
А вот функция timeAgo:
import TimeAgo from 'javascript-time-ago'
import en from 'javascript-time-ago/locale/en'
TimeAgo.addDefaultLocale(en)
const ago = new TimeAgo()
export const timeAgo = (date) => {
return ago.format(date)
}