【问题标题】:Not using the base attribute when making DomSanitizer API calls?进行 DomSanitizer API 调用时不使用基本属性?
【发布时间】:2024-01-06 17:17:01
【问题描述】:

我正在使用 DomSanitizer 拨打电话,如下所示:

        this.domSanitizer.bypassSecurityTrustResourceUrl(url));

url 是要获取的 SVG 图像的完整 URL。

这是一个例子:

      this.matIconRegistry.addSvgIcon(
        "fs",
        this.domSanitizer.bypassSecurityTrustResourceUrl('https://github.com/fireflysemantics/images/blob/master/fsalpha/logo/fsalpha-logo-optimized.svg'));

但是,由于 base 设置为 index.html 中的另一个 URL,因此 dom sanitizer URL 以它为前缀。

有没有办法关闭它?

这是我写的一篇文章,展示了在不添加 base 属性的情况下它是如何工作的:

https://medium.com/@ole.ersoy/angular-material-icon-from-github-hosted-svg-logo-d5c35b923d

而且这是一个stackblitz,显示当添加base属性时,对绝对URL的调用以base属性为前缀,所以传递的URL就坏了:

https://stackblitz.com/edit/angular-material-custom-icon-with-base?file=src/index.html

功能请求

Angular 对此问题提出了 WRT 功能请求:

https://github.com/angular/angular/issues/23139

角度问题

https://github.com/angular/angular/issues/34645

错误截图

这是堆栈跟踪的屏幕截图,显示基本 URL 位于图像 URL 之前:

【问题讨论】:

  • 网址是否以协议开头? http://
  • 是的,所有正在使用的资源 URL 都以 'https://fireflysemantics.github.io/images/' 开头
  • 这是打这些电话的应用程序:fsalpha-canary.fireflysemantics.com
  • 更新问题以显示您如何在模板中使用经过清理的 URL。
  • 我在这里没有看到任何错误。 stackblitz 缺少结束头标签。这个工作没有错误:stackblitz.com/edit/…,图片:imgur.com/v8QQS3R

标签: javascript angular typescript angular-httpclient


【解决方案1】:

这看起来像一个错误。 HttpClient 没有可能重写具有协议的 URL。

Material 图标注册表不会改变图标的​​任何 URL。它实际上并没有对 URL 做任何特别的事情,只是将加载延迟到 HttpClient。

https://github.com/angular/components/blob/09dc4594259cf1d6b34a5a0893c0bccaa132c319/src/material/icon/icon-registry.ts#L595

我无法重现这一点,因为它需要将应用程序部署到像 gh pages 这样的域,但如果你看到这种情况发生,请在 Angular GitHub 项目上打开一个问题并让他们知道。

我能给你的唯一答案是编写一个自定义拦截器来修复 URL。

这是一个解释如何使用拦截器来使用基本 URL 的博客。它不是关于如何解决您的问题的指南,但它是我能找到的最接近的东西。

http://www.projectcodify.com/angular-set-base-url-dynamically

【讨论】:

  • 谢谢!好观察!我将向 Angular 提出另一个问题。我链接的中型博客和 Stackblitz 演示显示了相同的行为。中篇文章有一个堆栈闪电战,它可以在没有基本属性的情况下工作。我分叉了它并添加了基本属性,它破坏了 URL。
  • @Ole 这很奇怪。我已经一起使用了 base 和 HttpClient 没有任何麻烦。它可能是消毒剂的边缘情况,我感觉这可能特定于 Angular 版本。希望这不是什么大问题,他们会解决它。
  • @Reactular 我认为你把它钉在了头上。确实没有理由使用前缀和绝对 URL,所以希望它会很快得到修复。再次感谢您的合作!
最近更新 更多