尝试使用ng-view模板使videoJS在角度指令中工作。角路由和模板注入都可以正常工作。

html代码:

<div ng-view>
</div>


模板代码:

<div ng-controller="VideoCntrl">
    <div class="row offset2" >
        <video id='myVideo' videodir controls class="video-js vjs-default-skin" >
            <source src="{{video.videoURL}}"  type="video/mp4" />
        </video>
    </div>
</div>


指令代码

    app.directive('videodir',function(){
        var linkFn;

        linkFn = function (scope, element, attrs){
               videojs("myVideo",{"techOrder": ["html5","flash"]},function(){
                    this.src({type: "video/mp4", src: scope.video.videoURL});
                    console.log(scope.video.videoURL);
                });
                console.log('linkfn');
            };

    return {
        restrict: 'A',
        link: linkFn
    }
});


指令videodir中的videojs ready函数仅在首次点击页面或重新加载页面时才触发。第一次访问页面时,我会在控制台日志中看到来自scope.video.videoURL的视频的URL,而DOM正在使用videoJS。如果我单击导航链接以加载其他模板,然后返回,则无法启动videojs ready函数(即,我在控制台日志中看不到我的videoURL,并且videoJS也未更改DOM。我确实看到了'linkFn每次加载模板代码时都在控制台中。我假设我正在执行console.log('linkFn')的指令中有一些初始化代码,我可以在videojs(“ myVideo”)对象上调用它以便对其进行操作DOM正确,但我不知道可能是什么。

任何帮助,不胜感激。

最佳答案

当在单个页面应用程序中使用带角度的videoJs时,需要在销毁范围(当您离开创建播放器的状态时)手动销毁videojs播放器,并在再次创建它时重新加载它。

就绪状态不会再次触发,因为当您向后导航时,从技术上讲,已经创建了videojs播放器,只是您的$ scope无法跟踪它。

无需在DOM中定义播放器源,而是动态创建videojs对象

有用的链接

(动态创建播放器)

https://github.com/videojs/video.js/blob/stable/docs/guides/setup.md#alternative-setup-for-dynamically-loaded-html

(按照角度指令放置播放器)

https://github.com/videojs/video.js/issues/808

DOM

<video id='myVideo' videodir controls class="video-js vjs-default-skin" ></video>


控制者

var setupOpt = {
    'controls' : false,
    'autoplay' : false,
    'preload' : 'auto',
    // 'poster' : asset.thumbnail,
    'width' : 'auto',
    'height': 'auto'
};

//inject $sce to use any url, or fetch url from http request
var vidSrc = $sce.trustAsResourceUrl("example.mp4");

//create video js player dynamically
videojs( 'myVideo', setupOpt, function(){
   $scope.vid = videojs( 'myVideo' ).src([ {type: "video/mp4", src: vidSrc} ]);
});

//destroy video when $scope is destroyed
$scope.$on( '$destroy', function() {
    console.log( 'destroying video player' );
    $scope.vid.dispose();
});

关于javascript - Angular 单页应用程序,videoJS就绪功能仅在页面加载时触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18751314/

10-09 23:21