Search code examples
htmlcssangularrxjshttpclient

angular httpclient subscribe not changing view


I made an Angular component, and I want to display the progress percentage value. But even though I change the percentage value. But it is not displayed in the view and the changes are applied with the first change on the page

  UploadFile(sender): void {
    const progress = new Subject<number>();
    const element = sender.currentTarget as HTMLInputElement;
    this.showUpload = true;
    this.showDownload = false;
    const formData: FormData = new FormData();
    formData.append('file', element.files[0]);
    try {
      let headers = new HttpHeaders();
      headers = headers.set('Content-Type', 'application/json; charset=utf-8');
      // Renew token
      this._httpClient
        .post('https://localhost:7009/api/FileManager/upload', formData, {
          reportProgress: true,
          observe: 'events',
        })
        .subscribe((events) => {
          if (events.type === HttpEventType.UploadProgress) {
            this.percentage = Math.round((100 * events.loaded) / events.total);
            console.log('percentage', this.percentage);
          } else if (events.type === HttpEventType.Response) {
          }
        });
    } catch (er) {
      console.log(er);
    }
  }

and html is (I deleted parts of the code for more readability)

<div>
    <mat-icon
        (click)="fileUpload.click()" [svgIcon]="'heroicons_outline:upload'">
    </mat-icon>
    <div class="upload-loader"[style.height.%]="percentage"></div>
    <input #fileUpload type="file" hidden="true" (change)="UploadFile($event)" />
</div>

css:

 .upload-loader
    {
        position: absolute;
        height: 0%;
        top: 0;
        left: 0;
        right: 0;
        width: 100%;
         opacity: 0.4;
        background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
        background-size: 300% 400%;
        animation: gradient 2s ease infinite;
    }

Solution

  • I was able to solve my problem I added the following code to my code

    
    this._changeDetectorRef.detectChanges();
    
    

    The whole code:

    
    UploadFile(sender): void{
            const element = sender.currentTarget as HTMLInputElement;
            const formData: FormData = new FormData();
            formData.append('file', element.files[0]);
                let headers = new HttpHeaders();
                headers = headers.set('Content-Type', 'application/json; charset=utf-8');
                // Renew token
             this._httpClient.post('https://localhost:7009/api/FileManager/upload' , formData ,{ reportProgress: true, observe: 'events' }).subscribe((events) => {
                if (events.type === HttpEventType.UploadProgress)
                {
                    this.percentage =Math.round(100 * events.loaded / events.total);
                  console.log('percentage', this.percentage);
                  this._changeDetectorRef.detectChanges();
                }
                else if (events.type === HttpEventType.Response) {
                    this.percentage = 0;
                    this._changeDetectorRef.detectChanges();
                }
    
              });
            
        }
    
    

    other way

    I was using onPush and when I activated the default mode, I didn't need detectChanges anymore

    @Component({
        selector: 'file_Uploader',
        templateUrl: './fileuploader.component.html',
        styleUrls: ['./fileuploader.component.scss'],
        encapsulation: ViewEncapsulation.None,
        changeDetection: ChangeDetectionStrategy.Default,
        exportAs: 'fileUploader',
    })