Angular 2"time ago"pipe

use*_*144 29 date pipe angular

我正在尝试为我的Angular 2应用程序创建一个'time ago'管道.

它应该将日期转换为字符串,例如"5分钟前"或"60秒前".它到目前为止工作得很好,但在第一次计算后它没有更新.如果给定日期是例如5秒前,它显示'5秒前',但在此之后永远不会改变.

我已经尝试将管道的"纯"值设置为false但这没有帮助.

这是我的代码:

import {Pipe, PipeTransform} from 'angular2/core';

@Pipe({
  name: 'messageTime',
  pure: false
})
export class MessageTimePipe implements PipeTransform {
  transform(value: Date, []): string {
    var result: string;

    // current time
    let now = new Date().getTime();

    // time since message was sent in seconds
    let delta = (now - value.getTime()) / 1000;

    // format string
    if (delta < 10) {
      result = 'jetzt';
    } else if (delta < 60) { // sent in last minute
      result = 'vor ' + Math.floor(delta) + ' Sekunden';
    } else if (delta < 3600) { // sent in last hour
      result = 'vor ' + Math.floor(delta / 60) + ' Minuten';
    } else if (delta < 86400) { // sent on last day
      result = 'vor ' + Math.floor(delta / 3600) + ' Stunden';
    } else { // sent more than one day ago
      result = 'vor ' + Math.floor(delta / 86400) + ' Tagen';
    }

    return result;
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用这样的过滤器:

打字稿:

import {Component, Input} from 'angular2/core';
import {MessageTimePipe} from '../../pipes/message-time.pipe';

@Component({
  selector: 'message-item',
  pipes: [MessageTimePipe],
  templateUrl: 'build/components/message-item/message-item.component.html'
})
export class MessageItemComponent {
  @Input()
  message: JSON;

  date: Date;

  ngOnInit() {

   this.date = new Date(2016, 3, 16, 12, 49, 10);
  }
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<p class="time">
  {{ date | messageTime }}
</p>
Run Code Online (Sandbox Code Playgroud)

Dav*_*eto 28

我刚用过这个:

https://www.npmjs.com/package/time-ago-pipe

npm install time-ago-pipe --save
Run Code Online (Sandbox Code Playgroud)

然后在@NgModule中你想用它:

import {TimeAgoPipe} from 'time-ago-pipe

@NgModule({
    imports: [... etc ...],
    declarations: [AppComponent, ...etc..., TimeAgoPipe],
    bootstrap: [AppComponent]
})
Run Code Online (Sandbox Code Playgroud)

在模板中:

<span>{{your_date | timeAgo}}</span>
Run Code Online (Sandbox Code Playgroud)

除非你打算更多地学习轮子,否则不要重新发明轮子.

  • 或者,除非你来自非英语国家,并且该图书馆不适合你...... (10认同)

kem*_*sky 21

最后让它工作,非常具有挑战性,需要间隔调整:)

import {Pipe, ChangeDetectorRef} from 'angular2/core';
import {Observable} from 'rxjs/Observable';
import {AsyncPipe} from 'angular2/common';

@Pipe({
    name: 'messageTime',
    pure: false
})
export class MessageTimePipe extends AsyncPipe
{
    value:Date;
    timer:Observable<string>;

    constructor(ref:ChangeDetectorRef)
    {
        super(ref);
    }

    transform(obj:any, args?:any[]):any
    {
        if (obj instanceof Date)
        {
            this.value = obj;

            if(!this.timer)
            {
                this.timer = this.getObservable();
            }

            return super.transform(this.timer, args);
        }

        return super.transform(obj, args);
    }

    private getObservable()
    {
        return Observable.interval(1000).startWith(0).map(()=>
        {
            var result:string;
            // current time
            let now = new Date().getTime();

            // time since message was sent in seconds
            let delta = (now - this.value.getTime()) / 1000;

            // format string
            if (delta < 10)
            {
                result = 'jetzt';
            }
            else if (delta < 60)
            { // sent in last minute
                result = 'vor ' + Math.floor(delta) + ' Sekunden';
            }
            else if (delta < 3600)
            { // sent in last hour
                result = 'vor ' + Math.floor(delta / 60) + ' Minuten';
            }
            else if (delta < 86400)
            { // sent on last day
                result = 'vor ' + Math.floor(delta / 3600) + ' Stunden';
            }
            else
            { // sent more than one day ago
                result = 'vor ' + Math.floor(delta / 86400) + ' Tagen';
            }
            return result;
        });
    };
}
Run Code Online (Sandbox Code Playgroud)