Angular 4 显示当前时间
Angular 4 display current time
在 angular 4 变化检测系统中显示当前时间的正确(规范)方式是什么?
问题如下:根据定义,当前时间每时每刻都在不断变化。但它不能被Angular 4 变化检测系统检测到。因此,在我看来,有必要显式调用 ChangeDetectorRef::detectChanges
。但是,在调用这个方法的过程中,当前时间自然会改变它的值。这导致 ExpressionChangedAfterItHasBeenCheckedError
。在以下示例 (see live) 中,此错误在加载页面后几秒钟内出现:
import { Component, ChangeDetectorRef } from '@angular/core';
@Component({
selector: 'my-app',
template: `{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}`
})
export class AppComponent {
get now() : string { return Date(); }
constructor(cd: ChangeDetectorRef) {
setInterval(function() { cd.detectChanges(); }, 1);
}
}
使用箭头函数。
constructor(cd: ChangeDetectorRef){
setInterval(() => { cd.detectChanges(); }, 1);
}
首先你不需要在你的间隔内调用 ChangeDetectorRef.detectChanges()
,因为 angular 正在使用 Zone.js
which monkey patches the browsers setInteral
method with its自己的。因此 angular 很清楚在一个时间间隔内发生的变化。
您应该像这样在间隔内设置时间:
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `{{ now }}`
})
export class AppComponent {
public now: Date = new Date();
constructor() {
setInterval(() => {
this.now = new Date();
}, 1);
}
}
But you shouldn't update the time on such a high rate, because it would lead to poor perfomance, because everytime the date updates angular performs a changedetection on the component tree.
如果您想以非常高的速度更新 DOM,您应该使用 NgZone
中的 runOutsideAngular
并使用 [=17] 手动更新 DOM =].
例如:
@Component({
selector: 'my-counter',
template: '<span #counter></span>'
})
class CounterComponent implements OnChange {
public count: number = 0;
@ViewChild('counter')
public myCounter: ElementRef;
constructor(private zone: NgZone, private renderer: Renderer2) {
this.zone.runOutsideAngular(() => {
setInterval(() => {
this.renderer.setProperty(this.myCounter.nativeElement, 'textContent', ++this.count);
}, 1);
});
}
}
根据 Angular 关于 DatePipe
Link 的文档,可以使用 Date.now()
。
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `{{ now | date:'HH:mm:ss'}}`
})
export class AppComponent {
now:number;
constructor() {
setInterval(() => {
this.now = Date.now();
}, 1);
}
}
CurrentTime: any;
constructor() {
setInterval(() => {
this.CurrentTime = new Date().getHours() + ':' + new Date().getMinutes() + ':'+ new Date().getSeconds()}, 1);
}
today: number = Date.now();
constructor() {
setInterval(() => {this.today = Date.now()}, 1);
}
如果要在 html 页面上设置格式,请按如下方式使用:
<p>{{today | date:'fullDate'}} {{today | date:'h:mm:ss a'}}</p>
我要再补充一点,因为这个答案,我发现了这一点并且可能更接近我的解决方案,所以对于另一个正在寻找类似问题的人,我也添加了这一点:)
如果你想获得 [Year: Month :date :hours: minutes with am/pm ] 格式的所有数字(例如:12 而不是字符串“December”),只需使用以下
<p>{{today | date:'y:M:d:h:mm a'}}</p>
实际上,您不需要任何库来完成这个简单的任务。如果您在 angular 项目中使用 angular 6+,则从通用包中导入 formatDate 并传递其他数据。这是一个示例:
import { Component } from '@angular/core';
import {formatDate } from '@angular/common';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
today= new Date();
todaysDataTime = '';
constructor() {
this.todaysDataTime = formatDate(this.today, 'dd-MM-yyyy hh:mm:ss a', 'en-US', '+0530');
}
}
这里是 stackblitz link,你可以在这里编辑:https://stackblitz.com/edit/angular-h63y8e
在angular 2+
如果我们使用反应形式
<input formControlName="scheduleTime" type="time" class="form-control ">
this.orderForm.controls.scheduleTime.setValue(new Date().toString().split(' ')[4]);
使用上面的代码我们将在时间输入中显示当前时间
在 angular 4 变化检测系统中显示当前时间的正确(规范)方式是什么?
问题如下:根据定义,当前时间每时每刻都在不断变化。但它不能被Angular 4 变化检测系统检测到。因此,在我看来,有必要显式调用 ChangeDetectorRef::detectChanges
。但是,在调用这个方法的过程中,当前时间自然会改变它的值。这导致 ExpressionChangedAfterItHasBeenCheckedError
。在以下示例 (see live) 中,此错误在加载页面后几秒钟内出现:
import { Component, ChangeDetectorRef } from '@angular/core';
@Component({
selector: 'my-app',
template: `{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}`
})
export class AppComponent {
get now() : string { return Date(); }
constructor(cd: ChangeDetectorRef) {
setInterval(function() { cd.detectChanges(); }, 1);
}
}
使用箭头函数。
constructor(cd: ChangeDetectorRef){
setInterval(() => { cd.detectChanges(); }, 1);
}
首先你不需要在你的间隔内调用 ChangeDetectorRef.detectChanges()
,因为 angular 正在使用 Zone.js
which monkey patches the browsers setInteral
method with its自己的。因此 angular 很清楚在一个时间间隔内发生的变化。
您应该像这样在间隔内设置时间:
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `{{ now }}`
})
export class AppComponent {
public now: Date = new Date();
constructor() {
setInterval(() => {
this.now = new Date();
}, 1);
}
}
But you shouldn't update the time on such a high rate, because it would lead to poor perfomance, because everytime the date updates angular performs a changedetection on the component tree.
如果您想以非常高的速度更新 DOM,您应该使用 NgZone
中的 runOutsideAngular
并使用 [=17] 手动更新 DOM =].
例如:
@Component({
selector: 'my-counter',
template: '<span #counter></span>'
})
class CounterComponent implements OnChange {
public count: number = 0;
@ViewChild('counter')
public myCounter: ElementRef;
constructor(private zone: NgZone, private renderer: Renderer2) {
this.zone.runOutsideAngular(() => {
setInterval(() => {
this.renderer.setProperty(this.myCounter.nativeElement, 'textContent', ++this.count);
}, 1);
});
}
}
根据 Angular 关于 DatePipe
Link 的文档,可以使用 Date.now()
。
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `{{ now | date:'HH:mm:ss'}}`
})
export class AppComponent {
now:number;
constructor() {
setInterval(() => {
this.now = Date.now();
}, 1);
}
}
CurrentTime: any;
constructor() {
setInterval(() => {
this.CurrentTime = new Date().getHours() + ':' + new Date().getMinutes() + ':'+ new Date().getSeconds()}, 1);
}
today: number = Date.now();
constructor() {
setInterval(() => {this.today = Date.now()}, 1);
}
如果要在 html 页面上设置格式,请按如下方式使用:
<p>{{today | date:'fullDate'}} {{today | date:'h:mm:ss a'}}</p>
我要再补充一点,因为这个答案,我发现了这一点并且可能更接近我的解决方案,所以对于另一个正在寻找类似问题的人,我也添加了这一点:)
如果你想获得 [Year: Month :date :hours: minutes with am/pm ] 格式的所有数字(例如:12 而不是字符串“December”),只需使用以下
<p>{{today | date:'y:M:d:h:mm a'}}</p>
实际上,您不需要任何库来完成这个简单的任务。如果您在 angular 项目中使用 angular 6+,则从通用包中导入 formatDate 并传递其他数据。这是一个示例:
import { Component } from '@angular/core';
import {formatDate } from '@angular/common';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
today= new Date();
todaysDataTime = '';
constructor() {
this.todaysDataTime = formatDate(this.today, 'dd-MM-yyyy hh:mm:ss a', 'en-US', '+0530');
}
}
这里是 stackblitz link,你可以在这里编辑:https://stackblitz.com/edit/angular-h63y8e
在angular 2+ 如果我们使用反应形式
<input formControlName="scheduleTime" type="time" class="form-control ">
this.orderForm.controls.scheduleTime.setValue(new Date().toString().split(' ')[4]);
使用上面的代码我们将在时间输入中显示当前时间