angular - 我怎样才能用 Ionic 做一个计时器?
问题描述
我正在尝试在我的 Ionic 应用程序中做一种计时器,它应该在我加载页面时启动,并且它应该每秒向先前初始化为 0 的变量添加一个值。我写了这个,但它不起作用:
ngOnInit() {
this.counter();
}
counter(){
while(this.value!=1){
timer(1000).subscribe(x => {this.value=this.value+0.075 })
}
}
timer 是从 'rxjs' 导入的方法。
在此期间必须更改的 HTML 片段是:
<ion-progress-bar value={{value}} buffer={{buffer}}></ion-progress-bar>
变量在这里定义:
private value_: number=0;
private buffer_: number=this.value;
最后我想说我已经创建了 set 和 get 方法。
解决方案
- 您实际上并不需要控制器中的订阅。您可以
async
在模板中使用管道。 - 您可以立即启动计时器,并将初始延迟设置为零:
timer(0, 1000)
. - 而不是
while
你可以使用takeWhile
运算符来完成 observable。
控制器
import { timer, Subject } from 'rxjs';
import { map, takeUntil, takeWhile } from 'rxjs/operators';
private stop$ = new Subject<any>();
private value_: number = 0;
private buffer_: number = this.value;
timer$ = timer(0, 1000).pipe(
takeUntil(this.stop$), // stop when `stop$` emits
takeWhile(_ => this.value_ < 1), // are you sure `this.value_ == 1` is right?
finalize(() => this.someMethod()), // run this method when observable completes
map(_ => {
this.value_ = this.value_ + 0.075;
return this.value_;
}
);
模板
// is buffer always set to zero?
<ion-progress-bar [value]="timer$ | async" [buffer]="buffer"></ion-progress-bar>
更新
- 当 observable 完成时,使用
finalize
operator 做某事。 - 使用
takeUntil
运算符随时停止可观察流。在这种情况下,我使用了一个Subject
名为stop$
. 当你想停止流时,像this.stop$.next()
. - 如果您
finalize
只想使用运行takeWhile
,则将takeUntil
操作符移到下方finalize
。当someMethod()
您明确停止流时,不会触发。
推荐阅读
- python - 如何使用pyxl(python)遍历excel中的特定列
- multiplication - 枫标量三倍积
- angular - 在 videojs 中的多比特率 hls 视频上未显示 PlaybackRateMenuButton
- haskell - Haskell 共享库未正确加载
- node.js - 错误:连接 ECONNREFUSED 127.0.0.1:3030
- php - 在电子邮件主题中输入值 - php mailer
- rest - API平台相关的资源创建实体
- java - 在Java方法的参数中使用printf
- sql - 两个表和重复组的 SQL 最小值最大值
- python - 在 Python 中有效地删除列表中的列表