【问题标题】:Use jQuery timeago or momentjs and AngularJS together一起使用 jQuery timeago 或 momentjs 和 AngularJS
【发布时间】:2013-02-08 14:14:26
【问题描述】:

我想使用timeago plugin 使日期看起来更漂亮。问题是这些日期是通过 AngularJS 从 REST 动态获取的。因此,当我将此 jQuery 插件附加到我的页面时,它只是不处理它。

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

【问题讨论】:

    标签: javascript jquery html angularjs


    【解决方案1】:

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

    然后您可以创建一个名为“timeAgo”或“fromNow”的过滤器。您可能应该将其称为 fromNow,因为 momentjs 就是这样称呼它的:

    angular.module('myApp').filter('fromNow', function() {
      return function(date) {
        return moment(date).fromNow();
      }
    });
    

    那么您只需在视图中使用简单的数据绑定:

    <p>Pizza arrives {{pizzaArrivalDate | fromNow}}</p>
    

    如果你真的想使用 jQuery 插件,你可能不得不写一个指令。但是这样做很糟糕,因为它将您的数据链接到 DOM 元素。我放在上面的方式将数据从 DOM 中分离出来,这是有角度的方式。而且很漂亮:-D

    【讨论】:

    • ...但是这个解决方案不会让时间随着时间的推移而更新,对吧?
    • 它没有。你会想要一个指令,它会每分钟左右刷新一次元素(你不希望它导致范围。$apply 每分钟,只需更新元素的文本)。
    • 花了一段时间才弄清楚该怎么做。使用“kwon”发布的指令对我没有用。事实证明,我不得不看标题属性。有关示例,请参见 gist.github.com/JensRantil/5470122
    • 应该注意,从像这样的全局变量中引用moment 并不符合最佳实践。注入$window 并通过$window.moment 获取它会更好...理想情况下,但是,您可以为moment 创建一个服务,您可以将其注入您的过滤器。这将允许您稍后通过 DI 更改您的实现,和/或更有效地进行单元测试。 ...值得深思。
    • ^是的,这就是它的可测试性。为 blesh 点赞
    【解决方案2】:

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

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

    <span am-time-ago="lastLoginTime"></span>
    

    上面span的内容会被替换成一个相对的时间字符串,比如“2小时前”,随着时间的推移会自动更新。

    【讨论】:

    • 伟大的发现 urish!工作和更新如前所述,请注意:不要忘记在您的应用中添加依赖项,请参阅 angular-moment 文档。
    • @urish: 有没有办法使用自定义格式的am-time-ago,例如“2 小时”而不是“2 小时前”?
    • 有关自定义am-time-ago格式的答案请参见此处:stackoverflow.com/questions/22964767/…
    【解决方案3】:

    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));
          };
        }
      ]);
    

    像这样使用它

    <div>{{ date | moment:'fromNow' }}</div>
    <div>{{ date | moment:'calendar' }}</div>
    

    您可以在这里查看它的实际操作http://jsfiddle.net/gregwym/7207osvw/

    【讨论】:

      【解决方案4】:

      如果你需要 jQuery,写一个指令/过滤器是最好的选择。

      app.directive("timeAgo", function($compile) {
        return {  
          restrict: "C",
          link: function(scope, element, attrs) {
            jQuery(element).timeago();
          }
        };
      });
      
      app.filter("timeAgo", function() {
        return function(date) {
          return jQuery.timeago(date); 
        };
      });
      

      Directive and/or Filter (jsbin)

      【讨论】:

      • 使用指令是让日期时间随着时间的推移自动更新的唯一方法。
      • 指令不需要“$compile”依赖。
      • 上述指令不处理“title”属性中的日期时间生成“{{ ... }}”语法的情况。请参阅 gist.github.com/JensRantil/5470122 以了解解决此问题的改进。
      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多