【问题标题】:Angular - Date pipe doesn't update value when used inside a ngForAngular - 在 ngFor 中使用时,日期管道不会更新值
【发布时间】:2020-02-12 21:45:10
【问题描述】:

我有一个 Angular 项目,我有一个 ngFor,我想用来自 Angular 的 Date 管道显示值。

<tr *ngFor="let p of months"> 
         <td>{{ p.month | date:'LLLL' }}</td>
</tr>

p.month 的值基本上可以是 1、2 或 3 等等。

管道无法正常工作,总是显示“一月”。

但如果我只显示{{ p.month }},那么在每个循环中我都会看到正确的值(1、2、3 等等)

我已经看到有不同的人有这个问题,我能找到的只是补充:

changeDetection: ChangeDetectionStrategy.OnPush

但是如果我添加这个,现在我的页面加载为空白,没有控制台错误,只是一个空白页面(页面的第一个元素是 ngFor,如果我在此之前添加一个带有字符串的简单 div,它会正确显示)

那么为什么ChangeDetection 会破坏我的页面?如何正确使用 ngFor 中的 Angular 日期管道?

【问题讨论】:

  • 1、2、3 不是 Date 实例。 DatePipe 会将 1 解释为 new Date(1),即 1970 年 1 月 1 日。
  • 要了解为什么使用OnPush 策略会破坏您的代码,我们需要整个应用程序。您可以尝试使用ngZonerunoutsideangular 来查看是否可以解决问题。

标签: angular


【解决方案1】:

您应该将Date 实例传递到日期管道中。

在您的模型中,您可以执行以下操作:

monthDates: Date[];

ngOnInit(): void {
  // this goes after wherever you are currently setting your months. 
  // I have used ngOnInit for demonstration purposes
  this.monthDates = this.months.map(m => new Date(1970, m - 1, 1));
}

然后在您的 html 中使用 Date 实例:

<tr *ngFor="let p of monthDates"> 
  <td>{{ p | date:'LLLL' }}</td>
</tr>

我假设您的月份数组是基于 1 的 - 1 = 一月,2 = 二月,等等。 请记住,javascript Date 对象中的月份是从 0 开始的 - 0 = 一月,1 = 二月,等等。

【讨论】:

  • 自 AngularJS 以来他们是否改变了这一点?当我以这种方式在AngularJS中使用这个管道时,它带有一个数字,它曾经工作过!我会试试你的解决方案
  • 我从未使用过 angularJS。最好将它们视为不同的框架!如果是这样的话,行为上的有趣变化。
  • 是的,这确实是问题,现在已经解决了,我不知道你必须将 Date 对象传递到 Date 管道中,使用 AngularJS 你可以传递一个整数
猜你喜欢
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2018-07-16
相关资源
最近更新 更多