Ошибка при попытке SafePipe очистить встроенные видео Youtube

У меня возникла дилемма при попытке встроить видео с YouTube в мое приложение Angular.

Я попытался использовать метод Angular DomSanitizer «bypassSecurityTrustResourceUrl()», и он правильно отображал видео. Но DOM продолжал обновляться, вызывая обновления, которые, очевидно, останавливали воспроизводимое в данный момент видео. Пожалуйста, посмотрите этот код:

media.component.ts

import { Component, OnInit, Injectable } from '@angular/core';
import { AngularFire } from 'angularfire2';
import { DomSanitizer } from '@angular/platform-browser';

import { VideoService } from '../../../services/videos/video.service';

@Component({
  selector: 'app-media',
  templateUrl: './media.component.html',
  styleUrls: ['./media.component.css']
})

@Injectable()
export class MediaComponent implements OnInit {

  videos = [];

  constructor( public af: AngularFire,
               private videoService: VideoService,
               private sanitizer: DomSanitizer ) {}


  getVideos() {
    this.videoService.getVideos().subscribe((data) => {
      this.videos = data;
    });
  }

  sanitizeVideo(index: number) {
    return this.sanitizer.bypassSecurityTrustResourceUrl(this.videos[index].videoUrl);
 }

  ngOnInit() {
    this.getVideos();
  }

media.component.html

<div class="container" *ngIf="videos">
  <h1 class="my-4">Videos
    <small>More to come</small>
  </h1>
<br><br>
  <div *ngFor="let video of videos; let i = index">
    <div class="row">
      <div class="col-md-6">
        <a href="#">
          <iframe width="560" height="315" [src]= "sanitizeVideo(i)" frameborder="5" allowfullscreen></iframe>
        </a>
      </div>
      <div class="col-md-5">
        <h3>{{ video.videoTitle }}</h3>
        <p>{{ video.videoDescription }}</p>
      </div>
    </div>
    <hr>
  </div>
</div>




Итак, я нашел больше информации об использовании конвейера, чтобы избежать проблемы с обновлением. Однако это создает следующую ошибку:

error_handler.js:60 Error: Uncaught (in promise): Error: Cannot match any 
routes. URL Segment: 'null'
Error: Cannot match any routes. URL Segment: 'null'

сейф.труба.тс

import { Pipe, PipeTransform } from '@angular/core';
import {DomSanitizer} from '@angular/platform-browser';

@Pipe({
  name: 'safe'
})
export class SafePipe implements PipeTransform {

  constructor( private sanitizer: DomSanitizer ) {}

  transform(url) {
    return this.sanitizer.bypassSecurityTrustResourceUrl(url);
  }

}

media.component.html

<div class="container" *ngIf="videos">
  <h1 class="my-4">Videos
    <small>More to come</small>
  </h1>
<br><br>
  <div *ngFor="let video of videos">
    <div class="row">
      <div class="col-md-6">
        <a href="#">
          <iframe width="560" height="315" [src]= "video.videoUrl | safe" frameborder="5" allowfullscreen></iframe>
        </a>
      </div>
      <div class="col-md-5">
        <h3>{{ video.videoTitle }}</h3>
        <p>{{ video.videoDescription }}</p>
      </div>
    </div>
    <hr>
  </div>
</div>

Есть ли какие-нибудь советы по правильному отображению встроенных видео на YouTube без постоянного обновления DOM?


person Kyle G.    schedule 28.10.2017    source источник


Ответы (1)


Не вызывайте sanitizeVideo() из привязки представления. Таким образом, он будет вызываться каждый раз при запуске обнаружения изменений. Вызовите его из кода и назначьте результат полю и вместо этого привяжите к этому полю,

person Günter Zöchbauer    schedule 28.10.2017
comment
Забыл прокомментировать, это помогло мне. Просто предварительно продезинфицирован в моем компоненте, перебирая данные и создавая автономный массив обработанных URL-адресов. Все работает хорошо. Спасибо вам за помощь. - person Kyle G.; 03.11.2017
comment
Пожалуйста. Рад слышать, что у тебя получилось. - person Günter Zöchbauer; 03.11.2017