2016-09-10 11 views
13

私はAngularJS 2アプリに問題があります(私はAngularJS 2のRC5バージョンを使用しています)。消毒されたURLが変更検出をトリガーしていて、コンポーネントの状態を変更していないのに、divを更新しているようです。URLサニタイズが埋め込みYouTubeビデオの更新を引き起こしています

これは、再生中にビデオのリロードとして現れます。

は、だから私は持っている私のコンポーネントビューで:

<div *ngIf="isVideo(item)"> 
    <iframe [src]="getTrustedYouTubeUrl(item)" scrolling="no" frameborder="0" allowfullscreen></iframe>   
</div> 

コンポーネントのコードで上記の関数の実装は次のとおりです。

デバッガで
getTrustedYouTubeUrl(linkedVideo:LinkedVideoModel) { 
    return this.sanitizer.bypassSecurityTrustResourceUrl(linkedVideo.video.url); 
}  

私はdiv要素がかなり頻繁に更新されることを参照してください。 AngularJS 2フレームワークでトリガーされたものによって。私はハードコーディングされたURLと上記のHTMLスニペットを置き換える場合

問題は、消える:

<div *ngIf="isVideo(item)"> 
    <iframe src="<hardcoded youtube url here>" scrolling="no" frameborder="0" allowfullscreen></iframe>   
</div> 

は、だから私は、URLのサニタイズがそれを引き起こしていることを疑っています。

誰でも正しい方向に向けることができますか?コンポーネントのプロパティにURLがバインドされている埋め込みYouTube動画の実例?

答えて

19

はそれを考え出しました。

興味のある方は、問題は、データが私のサービスにロードされ、この

にiframeの結合を変更されたとき、私は安全なURLを計算するコードを変更したら、リロード副作用が消えていた私のhtmlでこの機能を使用する

[src]="getTrustedYouTubeUrl(item)" 

ました

<iframe [src]="item.video.safeUrl" scrolling="no" frameborder="0" allowfullscreen></iframe>  

私は今プロパティにバインドしています。

+0

この問題は[src] = 'sanitizer.bypassSecurityTrustResourceUrl(this.Url)'を使用して数ヶ月後に私にポップアップしたばかりです。私はそれがなぜ始まったのか分かりません(角4.4、それを更新していません)。しかし、あなたのソリューションはそれを解決しました。ありがとう! – Anthony

+0

@Anthonyどうやってそれを正確に解決しましたか? [src] = 'sanitizer.bypassSecurityTrustResourceUrl(this.Url)を使用していますが、プロパティにsrcをバインドすると、「エラー:エラーが発生しました.RedUserURLが必要ですが、 URL(http://g.co/ng/security#xss参照)」メッセージが表示されます。 – handris

+0

@handris上記の私の答えを参照してください。 – Anthony

12

私はpure pipe

でそれを使用しよう

Angular executes a pure pipe only when it detects a pure change to the input value. A pure change is either a change to a primitive input value (String, Number, Boolean, Symbol) or a changed object reference (Date, Array, Function, Object).

パイプ(RC.6からDomSanitizerではなくのなりDomSanitizationService)のようになります。

@Pipe({ name: 'safe' }) 
export class SafePipe implements PipeTransform { 
    constructor(private sanitizer: DomSanitizer) {} 
    transform(url) { 
    return this.sanitizer.bypassSecurityTrustResourceUrl(url); 
    } 
} 

次のように使用してください:

<iframe [src]="url | safe" frameborder="0" allowfullscreen></iframe> 

Plunker Example(ボタンを押してみてください)

+0

おかげで、私はそれを試してみましょう。私はすでに別の回避策を見つけましたが、これは興味深い考えです。 – ayls

+0

/SafeValue%20must%20use%20[property]=binding:%20https://www.youtube.com/embed/wyVM1evRxNw%20(see%20http://g.co/ng/security) – user3561494

+0

ニースの解決策!Plunkerは何らかの理由で動作しません。最新版[Plunker Example](http://embed.plnkr.co/NEp3dZsJ7i8pKDOoJB8C/)(Angular v4.2.3を使用) – istibekesi

1

あなたはあなたの元の溶液を維持し、ちょうどそれがこのよう作業を取得するために

<div *ngIf="isVideo(item)"> 
    <iframe [src]="getTrustedYouTubeUrl(item)" scrolling="no" frameborder="0" allowfullscreen></iframe>   
</div> 
0

changeDetection: ChangeDetectionStrategy.OnPushが前の回答を合わせて使用​​することができます。

コンポーネントを。TS(関連部分のみ)

import { DomSanitizer } from '@angular/platform-browser'; 

constructor( 
    private sanitizer: DomSanitizer 
) { 
    this.sanitizer = sanitizer; 
} 

ngOnInit() { 
this.getTrustedUrl('http://someUrl'); 
} 

getTrustedUrl(url:any){ 
this.safeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url); 
} 

template.html

<iframe  
    [src]='this.safeUrl'> 
</iframe> 
関連する問題