使用
"angular2-moment": "^1.3.3",
"moment": "^2.18.1",
当我在模板中使用amTimeAgo
管道时:
<div *ngFor="let issue of getIssues() | async ">
{{ issue.time | amTimeAgo }}
<!--{{ issue.time | amUtc }}-->
<!--{{ issue.time | amLocal }}-->
<p>{{ issue.time | amDateFormat:'dddd, MMMM Do YYYY, h:mm:ss a' }}</p>
{{ issue.time }}
{{issue | json }}
</div>
,带有可观察性:
getIssues(): Observable<any[]> {
return Observable.of([
{
name: "1",
time: new Date(),
},
{
name: "2",
time: new Date(),
},
{
name: "2",
time: new Date(),
}
]);
}
常量每秒刷新一次(每次新的新Date())。
如何防止这种情况?
为什么每次都会收到新数据?
我每次都不想要新数据。另外,这将是一个HTTP调用,因此很昂贵。
我猜变化检测太频繁了......
我检查的其他管道似乎没有引起问题(例如amDateFormat)
答案 0 :(得分:3)
您的getIssues()
方法会在每次调用时创建一个新的Observable
。只要Angular有某些原因执行更改检测,就会调用该方法。您可能有一些事件源(可能是一些计时器或鼠标事件处理程序)触发更改检测,以便刷新时间值。您可以使用您发布的代码和一个按钮(以及一个单击处理程序)创建一个简单页面 - 当您单击该按钮时,时间会刷新。
所以唯一需要的是将observable分配给本地属性。
async
管道调用ChangeDetectorRef.markForCheck()
告诉Angular的更改检测,此组件可能会发生更改。有关更多详细信息,请参阅以下文章:
答案 1 :(得分:0)
为什么不在组件生命周期的Init步骤中创建当前的快照,然后在多个结果中重用它(假设之后没有代码会改变日期对象)?
currentDate: Date;
ngOnInit(): void {
this.currentDate = new Date();
}
getIssues(): Observable<any[]> {
return Observable.of([
{
name: "1",
time: this.currentDate,
},
{
name: "2",
time: this.currentDate,
},
{
name: "2",
time: this.currentDate,
}
]);
}
在这里使用ngOnInit
而不是构造函数非常重要。