【问题标题】:Angular Filtering based on current date基于当前日期的角度过滤
【发布时间】:2014-12-19 19:25:57
【问题描述】:

我有一个应用程序,它需要根据项目是等于当天还是过去来过滤项目。我的日期值被格式化为像“12/19/2014”这样的字符串。

我设置了一个过滤器,但由于日期格式不正确匹配,它返回一个空数组。

app.filter('publishFilter', function() { 

   return function(items) {

    var newItems = [];

    var currentDate = new Date();

    angular.forEach(items, function(item) {
      if (item <= currentDate) {
        newItems.push(item);
      }
    });

    return newItems;
  }
});

【问题讨论】:

  • 当您进行日期比较时,您需要将item 这也是一个字符串转换为日期。即尝试if (new Date(item) &lt;= currentDate) {
  • 看起来它遍历了每个数字并将它们存储在数组中 ["1","2","1","9","2","0","1" ,"4"]
  • 这可能是因为 items 不是你想象的那样。您是否尝试过 console.log 项目?另外你是如何使用这个过滤器的?

标签: angularjs angular-filters


【解决方案1】:

比较日期时,尝试将双方都转换为日期。假设 items 是代表日期的字符串列表 try:-

app.filter('publishFilter', function() { 

   return function(items) {

    if(!angular.isArray(items)) return [];

    var currentDate = new Date();
    currentDate.setHours(0,0,0,0); //Just normalize the time offset, since item is just time.

    return items.filter(function(item){
       return new Date(item) <= currentDate;
    });
  }
});

【讨论】:

  • 我已经添加了我的模板。这也返回了空数组。
  • 当然你做错了。 {{blo.date | publishFilter }} 您只向过滤器提供了一个日期字符串。现在我很困惑你想做什么?
  • 也许这在控制器中比作为过滤器更好。我以错误的方式解决这个问题。我试图限制提供给 ng-repeat 的结果。我仍然需要同样的逻辑,我猜只是在控制器中。
  • @byrdr 是的,在控制器中为项目列表执行此操作.. 除非您想在每个摘要周期运行过滤器。在视图中,您通常会将其与 ng-repeat 一起使用。基本上,您需要将过滤器与不在单个项目上的项目列表一起使用。因为在单个项目上没有什么要过滤的
  • 这是有道理的。感谢您帮助我。
【解决方案2】:

如果您使用 momentJS 库,这可以更安全、更简单地完成。对时间进行编程很像对金钱进行编程,您应该小心行事,因为最轻微的错误都会并将业务逻辑错误引入您的代码中。

_.forEach(items, function(item){
   if(moment().isBefore(moment(item){
       //do something
   }
)}

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多