【发布时间】:2021-11-28 15:41:21
【问题描述】:
我正在尝试实现一个进度条,该进度条根据我的 Angular 程序中运行的进程移动。
<div mat-dialog-content>
<mat-progress-bar mode="determinate" [value]="loadingVal"></mat-progress-bar>
</div>
var loadingVal = 0
var increase = 100 / array.length
for (i = 0, array.length, i++) {
....
this.loadingVal = this.loadingVal + increase
}
如您所见,我在循环的每次迭代中都增加了 loadingVal。但是,进度条没有移动,它一直停留在 0 直到过程完成。我做错了什么,还是有其他方法可以移动进度条?
【问题讨论】:
-
这不能那样工作,因为 JavaScript 是单线程的。 Angular 将在 完整函数返回之后运行其更改检测。如果您想看到一些进展,请尝试在循环中使用
window.setTimeout(() => this.loadingVal += increase, 500 * i);。setTimeout()函数将对这些回调进行排队,Angular 可以在其间执行更改检测。顺便说一句:尝试以这种方式编写你的 for 循环:for (let i = 0; i < array.length; i++) { ... } -
我的 for 循环是这样写的,我只是在快速输入时出错了哈哈。您能否在答案中告诉我您对 window.setTimeout() 的含义?
-
只需将
this.loadingVal = this.loadingVal + increase替换为window.setTimeout(() => this.loadingVal += increase, 500 * i);。注意:setTimeout()的第二个参数是应该调用回调的时间(以毫秒为单位)。我这里只用它来减慢进度条动画。 -
我试过了,好像没有什么不同。我尝试声明一个 const 变量
loader = 20并将其提供给 HTML,但它仍然不会显示。我认为它没有将价值从 TS 传递到 HTML ..? -
你在模板中是否也引用了你的表达方式?
标签: html angular typescript angular-material progress-bar