2016-11-19 3 views
2

Я создаю видеокомпонент, и мне нужно получить размеры исходного видео (исходного файла или контейнера), чтобы передать его компоненту-сиблиру. Я использую этот код:Получить исходные размеры видеотега в Angular 2

//Video component 
@Component({ 
    moduleId: module.id, 
    selector: 'kt-media', 
    templateUrl: 'kt-media.component.html' 
}) 

export class KT_MediaComponent implements AfterViewInit{ 
    ... 
    private ktIsMedia: boolean; 
    private ktMediaType: string; 
    @ViewChild('ktVideo') ktVideoElement; 

    constructor(private el: ElementRef, private renderer: Renderer) { 
    this.setMediaType(); 
    } 

    ngAfterViewInit(){ 
    this.ktVideoElement = this.getSize(); 
    } 

    setMediaType(){ 
    //This implementation works fine, I hide it for clarity of the problem 
    //Sets this.ktIsMedia to true and this.ktMediaType to 'video' 
    } 
    getSize():ktSize{ 
     let w = this.ktVideoElement.nativeElement.videoWidth; 
     let h = this.ktVideoElement.nativeElement.videoHeight; 
     return {width: w, height: h} 
    }  
} 

Здесь шаблон компоненты:

<div *ngIf="ktIsMedia && ktMediaType === 'video'" > 
    <video 
     #ktVideo> 
     <source 
      [attr.src]="ktMediaSrc |safeUrl" 
      type="video/{{ktVideoType}}"> 
    </video> 
</div> 

видео показано правильно, но исследуя против кода отладчика, это показывает, что ktVideoElement videoWidth и videoHeight является 0. Я попытался реализовать getSize() на разных крючках жизненного цикла: aferviewinit, oninit и т. Д. ... всегда всегда возвращает 0 в качестве размеров видео. Возможно получить размеры исходного файла или после загрузки файла в представление? Если это так, как я могу его реализовать?

+0

Получаете ли вы ожидаемые значения при использовании '$ 0.videoWidth' в консоли браузера? –

+0

Да, это показывает правильные размеры – Miguel

+1

Возможно, вам нужно подождать события видеоэлемента. Я не использовал его, но, возможно, есть какое-то «загруженное» или подобное событие, которое должно произойти до того, как элемент определит его размер. Вы также можете попробовать добавить кнопку к своему компоненту, который вызывает 'getSize()', просто чтобы увидеть, что вы можете получить ожидаемые значения из Angular2 в более поздний момент времени. –

ответ

2

По https://stackoverflow.com/a/4129579/217408 это должно работать:

<div *ngIf="ktIsMedia && ktMediaType === 'video'" > 
    <video (loadmetadata)="ktVideoElement = getSize()" 
     #ktVideo> 
     <source 
      [attr.src]="ktMediaSrc |safeUrl" 
      type="video/{{ktVideoType}}"> 
    </video> 
</div> 
+0

Поблагодарите Günter, что не работает, потому что некоторые небольшие детали. Я поставил ответ ниже. – Miguel

+0

Упс, извините. Это был надзор. Событие находится в элементе 'video'. Присвоение 'ktVideoElement' просто скопировано из вашего источника. Я не проверял, имеет ли это смысл ;-) –

1

на основе respone Гюнтер, в то, что работает, наконец, что:

<div *ngIf="ktIsMedia && ktMediaType === 'video'" > 
    <video 
     #ktVideo 
     (loadedmetadata)="ktSize = getSize()"> 
     <source 
      [attr.src]="ktMediaSrc |safeUrl" 
      type="video/{{ktVideoType}}"> 
    </video> 
</div> 

я изменил 'loadmetadat' на 'loadedmetadata' и положить в на вместо тега источника.

+0

Я хочу динамически устанавливать ширину и высоту видео на основе размера экрана того, кто обращается к странице, но то, что я не понимаю, является привязкой (loadmetadata) и переменной ktSize, где эти задавать –