javascript - 使用momentjs显示当前时间

标签 javascript angular typescript momentjs

我正在尝试创建一个动态显示当前时间的时钟组件。

Problem: Time is shown as expected on load (HH:mm A), but the clock does not change at all.

clock.component.ts:

import {
    ChangeDetectionStrategy,
    Component,
    OnInit
} from "@angular/core";
import { Observable, interval } from "rxjs";
import { map, distinctUntilChanged } from "rxjs/operators";
import * as moment from "moment";

@Component({
    selector: "app-clock",
    templateUrl: "./clock.component.html",
    changeDetection: ChangeDetectionStrategy.OnPush
})
export class ClockComponent implements OnInit {

    pageLoaded: moment.Moment;
    time: Observable<string>;

    constructor() {}

    ngOnInit() {
        this.pageLoaded = moment(new Date());

        this.time = interval(1000).pipe(
            map(() => this.pageLoaded.format("HH:mm A")),
            distinctUntilChanged()
        );
    }
}

clock.component.html:

<div>{{ time | async }}</div>

最佳答案

首先,如果我在你身边,我将使用 @types/moment 让我的生活更轻松(可选)。

那么,为什么“时钟根本没有改变”?

因为您在页面加载后初始化了时钟的值,并且该值不会更新,所以基本上 this.time 保存的是初始化值,而不是更新后的值,因此,以下是与您的组件相同,但版本较小。

import {
    ChangeDetectionStrategy,
    Component,
    OnInit
} from "@angular/core";
import { Observable, interval } from "rxjs";
import { map, distinctUntilChanged } from "rxjs/operators";
import moment, { Moment } from "moment"; // using @types/moment

@Component({
    selector: "app-clock",
    templateUrl: "./clock.component.html",
    changeDetection: ChangeDetectionStrategy.OnPush
})
export class ClockComponent implements OnInit {

    pageLoaded: Moment;
    time: Observable<string>;

    constructor() {}

    ngOnInit() {
    this.time = interval(1000*60).pipe( // why you need 1s interval with HH:mm time format simply update it every minute not every second.
      map(() => {
        this.pageLoaded = moment(new Date()); // you need the value of now not the value of the initialized time.
        return this.pageLoaded.format("HH:mm A");
      })
    );
  }
}

以及您的 View 本来的样子。

这是一个 stackblitz 示例,请自行检查 https://stackblitz.com/edit/angular-moment-rxjs

关于javascript - 使用momentjs显示当前时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53670691/

相关文章:

typescript - 使用 TS 条件类型缩小数值属性

javascript - 如何将字符串中的数组解析为javascript数组

javascript - 使用 Supertest 测试 Express 应用程序时,对第三方库的构造函数进行 stub

javascript - 如何在没有 Web 服务器的情况下使 respond.js 工作

angular - 数据源未在 ag 网格中执行

IE11 中的 Angular 4 错误

javascript - 在 js 中编码时正确的函数顺序

javascript - 使用 Javascript 将两个 SVG 元素合并为一个?

angular - ./src/main.ts 中的错误未找到模块(ng build --prod)

angularjs - 如何使 Typescript 与 SystemJS 和 Angular 一起使用成为可能?