Angular 6 View 不更新,即使使用 ChangeDetectorRef、ngZone 和 requestAnimationFrame

标签 angular angular-changedetection

在我的 component.ts 中,我有一个将 WAV 音频数据转换为 MP3 的循环:

for (var i = 0; i < samples.length; i += sampleBlockSize) {

  let sampleChunk = samples.subarray(i, i + sampleBlockSize);
  var mp3buf = mp3encoder.encodeBuffer(sampleChunk);
  if (mp3buf.length > 0) {
      mp3Data.push(mp3buf);
  }

  this.convertedPercent = Math.floor( ( i / samples.length ) * 100);
  console.log('convertedPercent: ' + this.convertedPercent);
}

console.log('This is where the HTML view jumps from 0% to 100%');

在我的 component.html 中,我有代码显示到目前为止已转换的音频百分比:

<p>Conversion is {{ convertedPercent }}% complete</p>

在转换过程中,它会将正确的转换百分比实时记录到控制台,但 View 仍停留在 0% 完成状态。一旦循环结束,它会立即跳到 100%。

我试过:

  • this.cd.detectChanges();
  • zone.run() 中包装改变 convertedPercent 值的行
  • requestAnimationFrame() 中换行更改 convertedPercent 的值

接下来我到底应该尝试什么?

最佳答案

众所周知,Javascript 是单线程的。如果你执行繁重的计算,你的主线程将被阻塞并且在它完成之前不会被释放。也许您可以尝试使用 Observables,异步操作浏览器将根据优先级处理它。

组件:

convertedPercent$ = new Subject<any>();
convertedPercent$.next(this.convertedPercent);

模板:

<p>Conversion is  {{ convertedPercent$ | async }}% complete</p>

关于Angular 6 View 不更新,即使使用 ChangeDetectorRef、ngZone 和 requestAnimationFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53236491/

相关文章:

html - Angular 9 : html select does respect value in model after click

angular - 如何避免使用 View 中的方法触发组件中的更改检测?

angular - 在 Angular(typescript) 中使用 tassign 的 Redux 试图加入 state.array 和 action.array 但获取 state.array.join 不是一个函数?

angular - 如何在从父组件中的 ajax 调用接收数据后更新子组件

Angular的新http客户端报错Cannot read property 'data' of undefined

angular - Angular 9 有什么新功能?

angular - 为什么 Angular 异步管道使用 cdr.markForCheck() 而不是 cdr.detectChanges()?

angular - 使用 'changeDetection: ChangeDetectionStrategy.OnPush' 时触发事件时如何防止更改检测?

javascript - d3.js v5.9.1 - 此版本中的某些方法未按预期工作

angular - 使用 --watch 依次运行两个 Angular CLI 任务