Angular 角度5-基本计时器对象未在UI中更新
我正在开发一个内置于Angular 5的应用程序,它需要一个基本的mm:ss倒计时计时器,它最终将被动态设置。我尝试过许多不同的解决方案,但都是以相同的方式进行的 我开始硬编码只是为了让它运行,并添加了一个基本功能:Angular 角度5-基本计时器对象未在UI中更新,angular,angular5,Angular,Angular5,我正在开发一个内置于Angular 5的应用程序,它需要一个基本的mm:ss倒计时计时器,它最终将被动态设置。我尝试过许多不同的解决方案,但都是以相同的方式进行的 我开始硬编码只是为了让它运行,并添加了一个基本功能: time: number = 60; interval; startTimer() { this.interval = setInterval(() => { if (this.time > 0) { this.time
time: number = 60;
interval;
startTimer() {
this.interval = setInterval(() => {
if (this.time > 0) {
this.time--;
} else {
this.time = 60;
}
}, 1000)
}
在前端,我用一个按钮调用函数:
<button (click)='startTimer()'>Start Timer</button>
<p>{{ time }} seconds remaining....</p>
启动计时器
还有{{time}}秒
当页面加载时,可以看到数字60。但它不会倒计时。当你按下按钮时,数字将变为它所能达到的任何一秒。例如,它将显示60,2秒后单击它,数字将变为58。因此,计时器正在后台运行,但用户界面中的数字没有更新
我不熟悉棱角,所以我可能会用一些基本的东西。我见过其他需要创建管道或订阅的解决方案,但我尝试过的所有解决方案似乎都与此相同。任何提示都将不胜感激 我认为最好使用RxJS而不是
setInterval()
方法。使用RxJStimer
函数和take
和map
操作符尝试以下操作
控制器
timer$:可观察;
startTimer(计数器:编号){
this.timer$=计时器(0,1000).pipe(
拿(柜台),
映射(=>--计数器)
);
}
模板
启动计时器
还有{{计时器}}秒
工作示例:
更新:RxJS的旧版本(我认为最好使用RxJS而不是
setInterval()
方法。使用RxJStimer
函数和take
和map
操作符尝试以下操作
控制器
timer$:可观察;
startTimer(计数器:编号){
this.timer$=计时器(0,1000).pipe(
拿(柜台),
映射(=>--计数器)
);
}
模板
启动计时器
还有{{计时器}}秒
工作示例:
更新:RxJS的旧版本(使用RxJS的另一种方式
//导入
从“rxjs”导入{interval,Observable};
从'rxjs/operators'导入{map,take};
...
//在组件内部
超时$:可观察到;
设置倒计时(时间=60){
此.timeout$=间隔(1000).pipe(
花点时间,
映射(t=>time-t-1)
);
}
启动计时器
还有{timeout$| async}}秒
使用RxJs的另一种方法
//导入
从“rxjs”导入{interval,Observable};
从'rxjs/operators'导入{map,take};
...
//在组件内部
超时$:可观察到;
设置倒计时(时间=60){
此.timeout$=间隔(1000).pipe(
花点时间,
映射(t=>time-t-1)
);
}
启动计时器
还有{timeout$| async}}秒
尝试此选项:
startTimer() {
this.interval = setInterval(() => {
if (this.time > 0) {
this.time -= 10;
} else {
clearInterval(this.interval);
this.time = 60;
}
}, 1000)
}
尝试此选项:
startTimer() {
this.interval = setInterval(() => {
if (this.time > 0) {
this.time -= 10;
} else {
clearInterval(this.interval);
this.time = 60;
}
}, 1000)
}
我认为您需要通过同步数据。@AbdelrhmanArnos:OP在需要模板中的
async
管道的时候没有使用可观察对象。我认为您需要通过同步数据。@AbdelrhmanArnos:OP在需要模板中的async
管道的时候没有使用可观察对象。我尝试过使用RxJS。问题不是如果从“rxjs”添加导入语句import{timer},则无法识别计时器-我假设这是由于是v5…?我发现了这个替代导入语句:import{timer}来自'rxjs/observable/timer';-它们是一个还是相同?@odinel:语法不同b/n rxjs 5+和rxjs 6+。我已经更新了rxjs v5的答案。我尝试过使用rxjs。问题是如果从“rxjs”添加import语句import{timer},则无法识别计时器-我假设这是因为是v5…?我发现了这个替代的导入语句:从'rxjs/observable/timer'导入{timer};-它们是一个还是相同的?@odinel:语法不同b/n rxjs 5+和rxjs 6+。我已经更新了rxjs v5的答案。