【问题标题】:Angular 2 Firebase Storage - Image preview on upload finishAngular 2 Firebase 存储 - 上传完成时的图像预览
【发布时间】:2016-12-18 14:46:00
【问题描述】:

我试图在uploadTask成功后显示上传的img,但是由于异步加载,视图试图在上传完成之前显示它。

这是方法:

upload(value){
    let file = value.target.files[0];
    let storageRef = firebase.storage().ref('noticias/' + file.name);
    let uploadTask = storageRef.put(file);

    uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED,
      function(snapshot) {
        let progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
        console.log('Upload is ' + progress + '% done');
        switch (snapshot.state) {
          case firebase.storage.TaskState.PAUSED: // or 'paused'
            console.log('Upload is paused');
            break;
          case firebase.storage.TaskState.RUNNING: // or 'running'
            console.log('Upload is running');
            break;
        }
      }, function(error) {
      switch (error) { 
        case 'storage/unauthorized':
          break;

        case 'storage/canceled':
          break;

        case 'storage/unknown':
          break;
      }
    }, function() {
      // Upload completed successfully, now we can get the download URL
      let downloadURL = uploadTask.snapshot.downloadURL;
      console.log('Upload done!');
    });

    storageRef.getDownloadURL().then(url => this.imgUrl = url);
    this.uploadedImg = true;
  }

这是视图:

<img *ngIf="uploadedImg" [src]="imgUrl" />

方法的最后两行加载得太早了。我还尝试将它们移动到成功函数中。问题是如果我将它们移到那里,this 不再引用该类,并且我无法更改视图中的值。

【问题讨论】:

    标签: javascript angular firebase firebase-storage


    【解决方案1】:

    丢失对this 的引用是javascript 中的一个常见问题,并且有一个简单的模式可以跟踪它。您在成功函数中移动线条是对的,只需在开头执行此操作:

    upload(value){
        let that = this;
        let file = value.target.files[0];
    

    现在that 将始终指向原始this,以下将按预期工作:

    }, function() {
        // Upload completed successfully, now we can get the download URL
        let downloadURL = uploadTask.snapshot.downloadURL;
        console.log('Upload done!');
        // Using original `this`
        storageRef.getDownloadURL().then(url => that.imgUrl = url);
        that.uploadedImg = true;
    });
    

    【讨论】:

    • 最糟糕的是我已经知道这种模式。我刚从学习 JS 跳到 Angular 太早了......谢谢!
    猜你喜欢
    • 2021-07-24
    • 2021-01-25
    • 2022-07-28
    • 2021-08-11
    • 2021-08-12
    • 2020-12-22
    • 2018-04-05
    • 2018-02-10
    • 2018-07-04
    相关资源
    最近更新 更多