清理 url 未在 iframe 中呈现

sanitize url is not rendering in iframe

我有一项服务 return 视频 url 的格式类似于 [url1,url2,...] 因为这些是不安全的 url 所以在循环中对它们进行消毒。

 import { Component, OnInit } from '@angular/core';
    import { HomeService } from '../home/home.service'
    import { BrowserModule, DomSanitizer } from '@angular/platform-browser'
    import { SafeResourceUrl } from '@angular/platform-browser/src/security/dom_sanitization_service';

@Component({
    selector: 'home',
    templateUrl: './home.component.html'
})
export class HomeComponent implements OnInit {

    videoCollection: string[] = [];
    videoCollectionSafe: SafeResourceUrl[];

    constructor(private homseService: HomeService, sanitizer: DomSanitizer) {
        this.homseService.getVideos().subscribe((response) => this.videoCollection = response.json());

        for (var i = 0; i < this.videoCollection.length; i++) {
            this.videoCollectionSafe.push(sanitizer.bypassSecurityTrustResourceUrl(this.videoCollection[i]));
        }
    }

    ngOnInit() {

    }
}

在html我写

  <!--<li *ngFor="let obj of videoCollectionSafe"><iframe width="560" height="315" [src]="obj" frameborder="0" allowfullscreen></iframe></li>-->
 <li *ngFor="let obj of videoCollectionSafe">{{obj}}</li>

这两行都没有 working.it 在页面上什么都不显示。谁能帮我解决这个问题。

将您的代码移至 ngOnInit()。检查有关 Angular 生命周期的信息:https://angular.io/guide/lifecycle-hooks

export class HomeComponent implements OnInit {

videoCollection: string[] = [];
videoCollectionSafe: SafeResourceUrl[];

constructor(private homseService: HomeService, sanitizer: DomSanitizer) {   }

ngOnInit() {

    this.homseService.getVideos().subscribe((response) => 
    this.videoCollection = response.json());

    for (var i = 0; i < this.videoCollection.length; i++) {         this.videoCollectionSafe.push(sanitizer.bypassSecurityTrustResourceUrl(this.videoCollection[i]));
    }

}
}

lesimoes 部分正确,您应该使用生命周期挂钩而不是构造函数。

更大的问题是您尝试在收到列表之前对其进行迭代。可观察订阅是异步的,就像任何 AJAX 调用一样。因此,您必须在取回数据后对数据采取行动。简单地将代码行放在 AJAX 调用之后是行不通的。

为此你有两个选择。

onComplete handler 中这样做:

export class HomeComponent implements OnInit {

    videoCollection: string[] = [];
    videoCollectionSafe: SafeResourceUrl[] = [];

    constructor(private homseService: HomeService, sanitizer: DomSanitizer) {}

    ngOnInit() {

        this.homseService.getVideos().subscribe(
            response => this.videoCollection = response,
            error => console.error(error),
            () => this.videoCollection.forEach(video => this.videoCollectionSafe.push(sanitizer.bypassSecurityTrustResourceUrl(video)))
        );
    }
}

onNext 处理程序中的更多 "functionally",因为您根本不需要中间 videoCollection 成员,看来:

export class HomeComponent implements OnInit {

    videoCollectionSafe: SafeResourceUrl[] = [];

    constructor(private homseService: HomeService, sanitizer: DomSanitizer) {}

    ngOnInit() {
        this.homseService.getVideos().subscribe(
            videoCollection => videoCollection.forEach(video =>  this.videoCollectionSafe.push(sanitizer.bypassSecurityTrustResourceUrl(video)))
            error => console.error(error)
        );
    }
}

此外,您还没有说明您使用的 angular 是哪个版本,但如果是 4.3 之后的版本,则不需要转换 response.json() because HttpClient will do that for you。如果您 运行 的 Angular 版本太旧以至于您仍然使用旧的 Http 您应该认真考虑升级,因为昨天发布了 6.0.0。