【问题标题】:angularJS filter dateangularJS过滤日期
【发布时间】:2014-12-17 00:12:27
【问题描述】:

我正在尝试使用过滤器来过滤掉作为字符串的日期。我从 API 获得的日期是

"/Date(1418716652000+0000)/"

我有一个函数可以将日期转换为我想要的类型:

1418716652000

函数是:

$scope.convertDate = function(published_first) {
    var date = (published_first.match(/\(.*\)/, ''));
    var convertedDate = date[0];
    date = eval(convertedDate.replace(/\//g,''));
    return date;
}

我的 HTML 是:

<div id ="news" ng-repeat="new in news | filter:convertDate">
  <h3 class="title" ng-repeat="n in new">
  <span>{{n.title}}</span><br/>
  <div class="title-data">              
    <span ng-if="n.byline.length > 0">by: {{n.byline}}</span>
    <br/>
    <span>
    <span>published: {{n.published_first | date:'medium'}}</span><br/>
    </span>
</div>  

我一直试图在我的 ng-repeat div 中的 HTML 中将其作为过滤器运行,但它不起作用。我还尝试在包含 angular date:'medium' 过滤器的同一跨度中运行过滤器。那也行不通。有人可以帮我解决我所缺少的吗?

【问题讨论】:

  • 您需要创建一个过滤器。将函数绑定到作用域是不够的。
  • 不要使用 eval。要将字符串转换为数字,请使用 +(convertedDate.replace(/\//g,'')) 或更语义化:Number(convertedDate.replace(/\//g,''))
  • @RobG 我试过 Number(convertedDate.replace(/\//g,'')) ,但我得到: undefined NaN, NaN NaN:NaN:NaN
  • convertedDate.replace(/\//g,'') 对您有什么价值?
  • 你应该可以使用date = +published_first.match(/\d+/)[0]

标签: javascript angularjs


【解决方案1】:

您正在使用的 API 似乎向您提供了带有 published_first 属性的新闻对象,该属性采用您希望以不同方式呈现的传输格式,但该数据在运行后不会更改已收到。

在任何类型的手表中将标记转换为过滤器或函数意味着您会不断地转换触发摘要的每个事件的日期。最好从接收新闻项目的控制器或服务运行 convertDate() 函数,并在从 API 接收到的每个项目上进行转换。在这种情况下,每个新闻项从字符串到日期的转换只进行一次,然后您的标记变为:

<span>published: {{n.published_first | date:'medium'}}</span>

此外,如果您可以确定来自 API 的格式将始终保持一致(应该如此),您可以将一行转换为时间戳:

$scope.convertDate = function(published_first) {
    return parseInt(published_first.substr(6), 10); 
}

该行删除了 /Date( 的初始非数字字符并解析到第一个非数字字符,即 +) 取决于精度。

【讨论】:

    【解决方案2】:

    1) 创建一个过滤器函数,如图所示here

    module.filter('convertDate', function() {
      return function(published_first) {
        var date = (published_first.match(/\(.*\)/, ''));
        var convertedDate = date[0];
        date = eval(convertedDate.replace(/\//g,''));
        return date;
      };
    })
    

    2) 使用您的过滤器来格式化您的日期:

    <div id ="news" ng-repeat="new in news">
      <h3 class="title" ng-repeat="n in new">
      <span>{{n.title}}</span><br/>
      <div class="title-data">              
        <span ng-if="n.byline.length > 0">by: {{n.byline}}</span>
        <br/>
        <span>
        <span>published: {{n.published_first | convertDate | date:'medium'}}</span><br/>
        </span>
    </div>  
    

    【讨论】:

      【解决方案3】:

      尽可能避免使用过滤器。 Filters can cause huge performance issues in large applications.

      也就是说,既然你把函数放在作用域上,你就可以在标记中使用它:

      <span>published: {{convertDate(n.published_first) | date:'medium'}}</span><br/>
      

      【讨论】:

      • 您的链接与我建议的formatting filter 无关。它属于subset selection。 @user3361996 的过滤器应用一开始就是错误的。
      • 我知道实现是错误的,并且您的过滤器实现是正确的。我的链接与过滤器的性能不佳有关,无论它们是用于格式化还是子集选择。 “尽可能避免使用过滤器。它们在每个摘要周期运行两次,一次是在发生任何变化时,另一次是为了收集进一步的变化,实际上并没有从内存中删除集合的任何部分,而是简单地用 css 屏蔽过滤的项目。”
      • 我不这样读:“......实际上并没有从内存中删除集合的任何部分,而是简单地用 css 屏蔽过滤的项目” - 这与格式无关.
      • 无论如何,这整个性能考虑不值得讨论,因为它是非常特定于上下文的,@user3361996 没有指定要呈现的项目数量。因此,虽然这是一个有趣的旁注,但对他/她来说可能永远不会成为问题。做出笼统的声明,例如“尽可能避免使用过滤器”,而没有具体说明这种做法的背景是非常可疑的。
      • 当您不了解格式化过滤器与“子集选择”过滤器在性能方面没有区别时,请拒绝我,这是非常可疑的。 "Filters can cause huge performance issues in large applications."。大型应用程序。那是上下文。 here's more context for you
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多