问题描述
我有一个很奇怪的问题:
我有一个超级简单的组件(ViewerComponent
)。那里没有太多逻辑,仅传递一个URL来在iFrame中显示URL(查看器)。 HTML看起来像这样:
<iframe class="w-100 h-100 border-0" [src]="viewerUrl | safe: 'resourceUrl'"></iframe>
safe
管道只是DOM Sanitizer。
问题在于,iFrame不断地被重新渲染。似乎它在每个变更检测周期中都被重新渲染。但是,奇怪的是viewerUrl
从未更改。
此外,该组件并未销毁(我正在ngOnDestroy()
中进行检查,但它从未在那里被销毁。为了使其更加不可思议,changeDetection
被设置为OnPush
,也没有任何更改注册(签入ngOnChanges()
)。
这是一个Angular 10应用程序。也许与此有关的一些错误?
任何帮助将不胜感激!
@更新:
请在此处查看安全管道:
@Pipe({
name: 'safe'
})
export class SafePipe implements PipeTransform {
constructor(protected sanitizer: DomSanitizer) {}
transform(value: any,type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {
switch (type) {
case 'html':
return this.sanitizer.bypassSecurityTrustHtml(value);
case 'style':
return this.sanitizer.bypassSecurityTrustStyle(value);
case 'script':
return this.sanitizer.bypassSecurityTrustScript(value);
case 'url':
return this.sanitizer.bypassSecurityTrustUrl(value);
case 'resourceUrl':
return this.sanitizer.bypassSecurityTrustResourceUrl(value);
default:
throw new Error(`Invalid safe type specified: ${type}`);
}
}
}
解决方法
我发现了问题所在。它被连接到管道,因为管道创建了对象的新实例,即该字符串的含义。
我通过注入src
参数来解决此问题:
const iframe = this.elementRef.nativeElement.querySelector('iframe');
iframe.src = url;
url
已通过保存管道进行了如下转换:
this.safePipe.transform(url,'resourceUrl');