You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 12使用DomSanitizer处理Iframe动态src属性时报错问题

问题原因

该报错不是Angular的官方Bug,是代码逻辑存在可优化点:

  • 你在ngOnInit中仅处理一次url转换,但如果父组件的youtubeUrlList是异步请求获取的,子组件初始化时@Input() url还未完成赋值,此时this.url为undefined,传入安全校验方法后返回的值不符合iframe src的类型要求,底层调用replace方法时就会抛出类型错误。
  • 另外如果youtubeUrlList中存在非字符串类型的元素,也会触发该报错。

修复方案

1. 子组件改用Input变化监听替代单次初始化处理

子组件类修改为:

export class YoutubeCardComponent implements OnChanges {
  @Input() url?: string
  safeSource?: SafeResourceUrl
  constructor(private sanitizer: DomSanitizer) { }

  ngOnChanges(changes: SimpleChanges) {
    // 仅当url存在且发生变更时,重新处理安全链接
    if (changes['url'] && this.url && typeof this.url === 'string') {
      this.safeSource = this.sanitizer.bypassSecurityTrustResourceUrl(this.url)
    }
  }
}

2. 子组件模板增加非空渲染判断

避免safeSource为空时绑定到iframe属性:

<iframe *ngIf="safeSource" [src]="safeSource"></iframe>

3. 父组件提前过滤无效链接

在父组件赋值youtubeUrlList前,过滤掉非字符串、不符合YouTube嵌入规则的无效值:

// 示例:处理原始链接列表
this.youtubeUrlList = rawList.filter(link => {
  return typeof link === 'string' && link.startsWith('https://www.youtube.com/embed/')
})

按上述方案调整后即可解决报错。

内容的提问来源于stack exchange,提问作者webicy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:45:08