【问题标题】:Countdown Timer in Angular 6Angular 6中的倒数计时器
【发布时间】:2018-10-30 10:19:41
【问题描述】:

您好,我正在尝试获取一个倒数计时器示例,我在 Stack 上搜索时发现:Time CountDown in angular 2

这是我的代码:

import { Component, ElementRef, OnInit, OnDestroy } from '@angular/core';
import { Observable, Subscription, interval  } from 'rxjs';

@Component({
  selector: 'app-timer',
  templateUrl: './timer.component.html',
  styleUrls: ['./timer.component.css']
})
export class TimerComponent implements OnInit {
  private future: Date;
  private futureString: string;
  private diff: number;
  private $counter: Observable<number>;
  private subscription: Subscription;
  private message: string;

  constructor(elm: ElementRef) {
      this.futureString = elm.nativeElement.getAttribute('inputDate');
  }

  dhms(t) {
      let days, hours, minutes, seconds;
      days = Math.floor(t / 86400);
      t -= days * 86400;
      hours = Math.floor(t / 3600) % 24;
      t -= hours * 3600;
      minutes = Math.floor(t / 60) % 60;
      t -= minutes * 60;
      seconds = t % 60;

      return [
          days + 'd',
          hours + 'h',
          minutes + 'm',
          seconds + 's'
      ].join(' ');
  }

  ngOnInit() {
      this.future = new Date(this.futureString);
      this.$counter = Observable.interval(1000).map((x) => {
          this.diff = Math.floor((this.future.getTime() - new Date().getTime()) / 1000);
          return x;
      });

      this.subscription = this.$counter
          .subscribe((x) => this.message = this.dhms(this.diff));
  }
}

得到以下错误:

timer/timer.component.ts(44,34):错误 TS2339:属性“间隔” 'typeof Observable' 类型上不存在。

我已经尝试了所有可以在 Google 上找到的导入方法,但没有任何效果。我也更新到最新版本的 rxjs 还是什么都没有。任何帮助将不胜感激。

我相信我可能有某种版本问题或其他问题。真难过。

npm ERR! peer dep missing: jquery@1.9.1 - 3, required by bootstrap@4.1.1
npm ERR! peer dep missing: popper.js@^1.14.3, required by bootstrap@4.1.1
npm ERR! missing: mkdirp@0.5.1, required by node-pre-gyp@0.9.1
npm ERR! missing: minimist@0.0.8, required by mkdirp@0.5.1
npm ERR! missing: minimatch@3.0.4, required by ignore-walk@3.0.1
npm ERR! missing: brace-expansion@1.1.11, required by minimatch@3.0.4
npm ERR! missing: balanced-match@1.0.0, required by brace-expansion@1.1.11
npm ERR! missing: concat-map@0.0.1, required by brace-expansion@1.1.11
npm ERR! missing: console-control-strings@1.1.0, required by npmlog@4.1.2
npm ERR! missing: inherits@2.0.3, required by readable-stream@2.3.6
npm ERR! missing: safe-buffer@5.1.1, required by readable-stream@2.3.6
npm ERR! missing: safe-buffer@5.1.1, required by string_decoder@1.1.1
npm ERR! missing: console-control-strings@1.1.0, required by gauge@2.7.4
npm ERR! missing: string-width@1.0.2, required by gauge@2.7.4
npm ERR! missing: strip-ansi@3.0.1, required by gauge@2.7.4
npm ERR! missing: code-point-at@1.1.0, required by string-width@1.0.2
npm ERR! missing: is-fullwidth-code-point@1.0.0, required by string-width@1.0.2
npm ERR! missing: strip-ansi@3.0.1, required by string-width@1.0.2
npm ERR! missing: number-is-nan@1.0.1, required by is-fullwidth-code-point@1.0.0
npm ERR! missing: ansi-regex@2.1.1, required by strip-ansi@3.0.1
npm ERR! missing: string-width@1.0.2, required by wide-align@1.1.2
npm ERR! missing: inherits@2.0.3, required by glob@7.1.2
npm ERR! missing: minimatch@3.0.4, required by glob@7.1.2
npm ERR! missing: once@1.4.0, required by glob@7.1.2
npm ERR! missing: once@1.4.0, required by inflight@1.0.6
npm ERR! missing: wrappy@1.0.2, required by inflight@1.0.6
npm ERR! missing: wrappy@1.0.2, required by once@1.4.0
npm ERR! missing: minipass@2.2.4, required by tar@4.4.1
npm ERR! missing: mkdirp@0.5.1, required by tar@4.4.1
npm ERR! missing: safe-buffer@5.1.1, required by tar@4.4.1
npm ERR! missing: yallist@3.0.2, required by tar@4.4.1
npm ERR! missing: minipass@2.2.4, required by fs-minipass@1.2.5
npm ERR! missing: safe-buffer@5.1.1, required by minipass@2.2.4
npm ERR! missing: yallist@3.0.2, required by minipass@2.2.4
npm ERR! missing: minipass@2.2.4, required by minizlib@1.1.0

【问题讨论】:

  • 在示例中,他们似乎正在导入表单 from 'rxjs/Rx'; 并且您从 rxjs 导入
  • Property interval does not exist in the type observable 的可能重复项。尝试搜索您遇到的错误;通常有很多热门歌曲可供尝试。
  • 嗨,迈克——我实际上搜索了所有内容,并遇到了相同的页面。仍然会导致错误。错误 TS2307:找不到模块 'rxjs-compat/observable/interval'。 node_modules/rxjs/observable/interval"' 没有导出成员 'interval'。
  • 请注意,Observable 类型变量的约定是使用$ 作为后缀,而不是作为前缀。您也可以选择不添加后缀。
  • 我不得不说你对map的使用并不常见。是否有理由使用它而不是立即订阅并在那里进行操作?您没有将流的值映射到不同的东西......

标签: angular rxjs


【解决方案1】:

ngx-countdown 是更成熟的解决方案。它提供了所有格式化选项以及启动/停止/暂停/恢复功能。

现场演示here

【讨论】:

  • 如果您想在*ngFor 中的每个项目上实现计时器,而不是ngx-countdown 是最好的选择。自上周以来,我一直在寻找实现相同目标的解决方案,除非我找到这个答案,否则我没有解决方案。欢呼!我终于可以做到了。感谢ngx-countdown
  • 你能用ngx-countdown得到每一次报价的回调吗?
【解决方案2】:

简单写:

import { interval } from 'rxjs';
import { map } from 'rxjs/operators'

interval(1000).pipe(
  map((x) => { /* your code here */ })
);

在 RxJS 6+ 中没有 Observable.interval 函数。

【讨论】:

  • 嗨——当我尝试这个时,我收到了以下错误:错误 TS2339:属性 'map' 不存在于类型 'Observable'。感谢您的帮助,新手在这里。
  • 我的错。我更新了代码以反映 RxJS 6+ 中的正确用法。
  • 代码编译,我得到一个结果,但它根本没有按我的预期运行。它返回 -17000+ 天的日期。老实说,我真的不确定自己在做什么。我只是想达到一个可以在我的 HTML 页面上显示基于我设置的可变日期/时间的时钟倒计时计时器的地步。如果有更好的方法请告诉我。我只是基于我在 Stack 上找到的东西。此外,由于您解决了我为此创建的问题,因此我会将您的问题标记为答案。
  • 好的。在我看来,你的问题得到了回答。我建议调试你的代码,看看你的结果日期是在哪里计算的。只需一步一步,我相信你会找到它。如果您以后还有其他问题,可以提出一个新问题。
【解决方案3】:

Rxjs 6.0 你必须从rxjs/observable/interval 导入interval

您必须使用pipe 运算符来顺序执行无限数量的运算符。

import { interval } from 'rxjs';
import { map } from 'rxjs/operators'

this.$counter = interval(1000).pipe(
   map((x) => {
      this.diff = Math.floor((this.future.getTime() - new Date().getTime()) / 1000);
      return x;
  });
)


参考: https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md#build-your-own-operators-easily

【讨论】:

  • 我现在收到此错误:./src/app/hertz/timer/timer.component.ts 中的错误模块未找到:错误:无法解析 'rxjs/observable/interval' 'C:\Users\USER\GitHub\angular\src\app\hertz\timer' 感谢您的帮助。我的 ngOnInIt 中的代码: ngOnInit() { this.future = new Date(this.futureString);间隔(1000).pipe(map((x) => { this.diff = Math.floor((this.future.getTime() - new Date().getTime()) / 1000); return x; }) ;)
  • rxjs 版本是什么。签入package.json
  • 确保rxjs 6.0+安装正确
  • 在我的 package.json 中显示:"rxjs": "^6.1.0",
  • @RitwickDey 您是否找到了您需要了解答案中的导入对于 RxJS 6 不正确的文档?如果没有,请务必阅读migration documentation
猜你喜欢
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2012-11-08
  • 2013-12-14
  • 2017-04-14
相关资源
最近更新 更多