使用jQuery timeago或momentjs和AngularJS

Ser*_*rov 36 html javascript jquery angularjs

我想使用timeago插件让日期看起来更好.问题是这些日期是通过AngularJS从REST动态获取的.所以,当我将这个jQuery插件附加到我的页面时,它只是不处理它.

那么,如何更好地做这样的事情呢?如果可能的话,我很乐意在没有jQuery的情况下运行.

And*_*lin 102

我会使用momentjs - http://momentjs.com/ - 它没有依赖关系.

然后你可以创建一个名为'timeAgo'或'fromNow'的过滤器.你可能应该调用它,fromNow因为这就是momentjs所谓的:

angular.module('myApp').filter('fromNow', function() {
  return function(date) {
    return moment(date).fromNow();
  }
});
Run Code Online (Sandbox Code Playgroud)

然后你只需在视图中使用简单的数据绑定:

<p>Pizza arrives {{pizzaArrivalDate | fromNow}}</p>
Run Code Online (Sandbox Code Playgroud)

如果你真的想使用jQuery插件,你可能需要编写一个指令.但这种做法很糟糕,因为它将您的数据链接到DOM元素.我在上面的方式分离DOM的数据,这是角度方式.这很漂亮:-D

  • ...但是这个解决方案不会随着时间的推移而更新时间,对吧? (2认同)
  • 应该注意的是,从像这样的全局变量引用"moment"并不是最符合最佳实践的.注入`$ window`并通过`$ window.moment`获取它会更好......*理想情况下*,但是,你可以为`moment`创建一个可以注入过滤器的服务.这将允许您通过DI更改您的实现,和/或更有效地进行单元测试.......深思熟虑. (2认同)

uri*_*ish 20

您可以使用angular-moment模块(基于Moment.js)的am-time-ago指令.

它不需要jQuery,随着时间的推移,时间会更新.例:

<span am-time-ago="lastLoginTime"></span>
Run Code Online (Sandbox Code Playgroud)

上述跨度的内容将替换为相对时间字符串,例如"2小时前",并将随着时间的推移自动更新.


Gre*_*ang 6

moment.js是最好的选择.我创建了一个通用的时刻过滤器,允许您使用任何时刻格式化方法.

angular.module('myApp', [])
  .filter('moment', [
    function () {
      return function (date, method) {
        var momented = moment(date);
        return momented[method].apply(momented, Array.prototype.slice.call(arguments, 2));
      };
    }
  ]);
Run Code Online (Sandbox Code Playgroud)

像它一样使用它

<div>{{ date | moment:'fromNow' }}</div>
<div>{{ date | moment:'calendar' }}</div>
Run Code Online (Sandbox Code Playgroud)

你可以在这里查看它http://jsfiddle.net/gregwym/7207osvw/