【问题标题】:AngularFire2 / Firestore Storage - getDownloadURL() (Ionic)AngularFire2 / Firestore 存储 - getDownloadURL() (Ionic)
【发布时间】:2018-12-29 14:00:22
【问题描述】:

我是一个相当新的 Ionic 开发人员,正在使用 Firestore 构建这个项目列表 Ionic 应用程序,到目前为止一切都很好 - 我现在想在我的项目中添加一张图片。

在将图片成功上传到存储后 - 我设法将 URL 保存到我的项目中,我认为就是这样,它应该可以通过简单地引用它来工作,例如 "[src]="project.图片”,但我开始意识到它没有为我提供 Firestore 存储的完整 URL,显然必须使用方法“getDownloadURL() 接收最后一点“?。

下面的代码是其中一种方法,我试图用它来实现这一点 - 不成功。通过执行前面提到的代码会导致应用程序没有响应,从而导致崩溃并且没有项目图片..

projectlist.html

<ion-card *ngFor="let project of projectsService.projectList | async" (click)="openProject(project)">

                <ion-card-content>
                  <ion-item text-right><h3><b>Status:</b> {{project.status}}</h3></ion-item>
                <ion-item text-left text-wrap>
                    <p><img *ngIf="project.picture"[src]="getProjectPictureByRowId(project)"></p>
                      <h2><b>{{project.name}}</b></h2> 
                      <p>{{project.description}}</p>
                </ion-item>

projectlist.ts

getProjectPictureByRowId(project : Project) {
  project.picture = this.projectsService.getProjectPictureByRowId(project);
}

projects.ts(提供者)

getProjectPictureByRowId(project) {

const ref = this.storage.ref(project.picture);
return project.picture = ref.getDownloadURL().toString();

}

我有一个使用文档 (https://github.com/angular/angularfire2/blob/master/docs/storage/storage.md) 中的以下代码的半工作解决方案,但只有 打开单个项目但不在项目列表中时工作:

@Component({
selector: 'app-root',
template: `<img [src]="profileUrl | async" />`
})
export class AppComponent {
profileUrl: Observable<string | null>;
constructor(private storage: AngularFireStorage) {
 const ref = this.storage.ref(project.picture);
 this.profileUrl = ref.getDownloadURL();
 }
}

我在这里不知所措 - 我已经用完了我所有的 Google-fu。请帮帮我!

问候,

詹斯

【问题讨论】:

    标签: javascript angular firebase-storage angularfire2


    【解决方案1】:

    如果您查看definition of StorageReference.getDownloadUrl(),您会看到它返回了一个承诺:

    getDownloadURL(): Promise<string> { ...
    

    所以调用不会返回 URL 本身,而是最终将解析为该 URL 的承诺。任何需要下载 URL 的代码都需要处理异步加载这一事实。

    在 AngularFire2(包装了上面的代码)中,这个 promise 被转换为下载 URL,它是一个 observable。根据AngularFire documentation,这意味着您需要将其绑定到我们的HTML 为async。所以:

    <img *ngIf="project.picture" [src]="getProjectPictureByRowId(project) | async"></p>
    

    【讨论】:

    • 首先 - 感谢您的快速回复 - 非常感谢,弗兰克! :-)。我实际上已经尝试了上述方法,使用管道异步,但遗憾的是它仍然导致应用程序没有响应并最终导致会话超时。我不确定 - 我实际上可以通过将 observable 传递给字符串来执行上述操作吗?还是确实有必要正如上面文档中的示例所暗示的那样 - 以与字符串相反的可观察对象返回结果?我怎样才能最好地做到这一点? - 谢谢。
    • 您使用的是 AngularFire 的 ref.getDownloadURL() 不是吗?这已经返回了一个可观察的。我只是不确定 Angular 是否可以解析方法调用(我远非 Angular 专家)。
    • 是的,我是。我也不 :/。谢谢你的协助!希望 Angular 专家会在某个时候出现,也许 :-)。
    猜你喜欢
    • 2018-08-27
    • 2019-11-06
    • 2018-03-25
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2020-04-02
    • 2018-10-02
    相关资源
    最近更新 更多