【问题标题】:How to display a dynamic image URL with an Observable token如何使用 Observable 令牌显示动态图像 URL
【发布时间】:2021-06-23 16:11:36
【问题描述】:

我需要在 ionic 移动框架中使用 Angular 显示一张图片。

HTML 如下所示:

<div class="avatar-image" [ngStyle]="{'background-image': getAssetImage(item.imageUrl)}"></div>

现有的 Angular 打字稿如下所示:

  public getAssetImage(image) {
    const imagepath = Constants.mediaUrl + '/' + image;
    return "url('" + imagepath + "')";
  }

最近图像资产已得到保护,因此我需要提供有效的访问令牌才能获取图像。

有一个现有服务将令牌作为 Observable 提供给我:

this.authService.getToken()

理想情况下,我真正想做的是找到一种方法将该令牌添加为授权标头,但我不确定这是否可能。我尝试使用 HTTP 拦截器,它在普通 GET 上工作正常,但不会为 CSS 'background-image' 调用。

在这个阶段,我只需要将令牌作为查询参数添加到 URL 中,如下所示:

https://myserver/myimage.jpg?access_token=theTokenValueThatComesFrom_authService.getToken

我不知道如何使用 Observable getToken() 方法来完成这项工作。

【问题讨论】:

    标签: angular typescript ionic-framework observable


    【解决方案1】:

    最简单的方法是使用等待令牌响应的 ngIf 包装您的代码,然后编辑您的 getAssetImage 以将令牌也作为参数。

    <ng-container *ngIf="token">
    <div class="avatar-image" [ngStyle]="{'background-image': getAssetImage(item.imageUrl, token)}"></div>
    </ng-container>
    
    

    所以在你订阅并得到token的响应后,div就会呈现出来。

    【讨论】:

      【解决方案2】:

      您可以使用 async-pipe 等待可观察的令牌,然后使用 mergeMap 将图像 url 添加到其中:

      HTML:

      <div class="avatar-image" [style.backgroundImage]="getAssetImage(item.imageUrl) | async"></div>
      

      TS:

         public getAssetImage(imageUrl: string) {
           return this.authService.getToken().pipe(take(1), mergeMap(token => {
              const imagepath = Constants.mediaUrl + '/' + imageUrl;
              return `url("${imagePath}?access_token=${token}")`
            }
         }
      

      【讨论】:

      • 谢谢 - 我试过了。它只是不断循环到函数中,但从未返回任何内容。
      • 在 Stackblitz 中测试过,对我有用。在 take(1) 中编辑,因为您可能每次加载只需要一次令牌。 :)
      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      相关资源
      最近更新 更多