javascript - 使用 *ngIf 加载微调器在函数执行期间未显示

标签 javascript angular typescript

如果在执行函数时尝试显示加载微调器。我已经尝试过不同的方法,但微调器不会显示。

这是 HTML:

<div class="row pt-3" id="firstRow">
 <div class="col">
  <button class="btn btn-dark back-button">
   <fa name="upload"></fa>
   <span>Load .csv file</span>
  </button>
  <input type="file" #fileImportInput name="File Upload" class="txtFileUpload p-3" (change)="fileChangeListener($event)" accept=".csv" />
    <img class="spinner" *ngIf="loading" src="../../../assets/img/gif-spinner/Spin-2s-200px.gif" />
 </div>
</div>

这是TS代码的一部分

export class MotionAnalysisComponent implements OnInit {
loading = false;

 fileChangeListener($event: any): void {
   this.loading = true;

   let files = $event.srcElement.files;

   if (this.isCSVFile(files[0])) {
    let input = $event.target;
    let reader = new FileReader();
    reader.readAsText(input.files[0]);

    reader.onload = () => {
     let csvData = reader.result;
     let csvRecordsArray = (<string>csvData).split(/\r\n|\n/);
     this.csvRecords = this.getDataRecordsArrayFromCSVFile(csvRecordsArray, 4);
   };

   reader.onerror = function () {
    alert('Unable to read ' + input.files[0]);
   };
  } else {
    alert("Please import valid .csv file.");
    this.fileReset();
  }

   this.loading = false;

如果我在函数中注释掉“this.loading = false”,那么微调器将在函数执行后显示并且(显然)不会消失。那么我怎样才能让 HTML 理解在函数执行期间应该显示微调器呢?

最佳答案

为了让微调器有时间初始化,您可以在将 loading 设置为 true 后异步运行代码。这可以通过将代码移动到 setTimeout 回调中来实现。 loading 属性应在该回调方法结束时重置。

fileChangeListener($event) {
  this.loading = true;                    // First, set loading property
  setTimeout(() => {                      // Call setTimeout to run code asynchronously
    let files = $event.srcElement.files;
    if (this.isCSVFile(files[0])) {
      ...
    } else {
      ...
    }
    this.loading = false;                 // Reset loading before leaving callback method
  }, 0);
}

参见 this stackblitz一个演示。请注意,如有必要,您可以增加 setTimeout 延迟(在上例中设置为 0 毫秒)。

关于javascript - 使用 *ngIf 加载微调器在函数执行期间未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57967033/

相关文章:

javascript - 将 ACF 与 GraphQL 和 Gatsby 结合使用,灵活内容不会返回其子 block 的顺序

javascript - Chrome 扩展仅在具有特定内容的类上注入(inject) css

angular - Angular 新手,无法从组件外部访问变量

angular - ngrx store - 选择一个实体以在单独的模板中显示

javascript - 错误 : Unexpected value 'FormGroup' declared by the module 'DynamicTestModule'

reactjs - 使用 typescript : Property 'data' does not exist on type react 钩子(Hook)

javascript - 如何使用 jQuery-Facebook-Photo-Selector 提示 facebook 登录

javascript - 如果单击时字段为空,则显示工具提示

angular - 错误: p-button (and p-password) is not a known element

angular - 引用错误 : "__decorate is not defined" when passing input to an angular directive