2013-07-28 17 views
5

Tôi mới sử dụng AngularJS. Tôi phải tạo điều khiển hải quan cho trình phát video (HTML5 <video>). Về cơ bản, tôi sẽ sử dụng getElementById('myvideotag'), nghe nhấp chuột vào video để phát/tạm dừng. Làm thế nào tôi có thể làm điều này với AngularJS? Liên kết nhấp chuột với ng-click="videoPlayPause()" nhưng sau đó, cách tôi phát hoặc tạm dừng video. Tôi sử dụng các phương pháp cổ điển của <video> như thế nào?Điều khiển trình phát video HTML5 tùy chỉnh với AngularJS

Tôi đoán nó thực sự đơn giản ... Tôi chưa nhận được tất cả các khái niệm AngularJS!

Cảm ơn bạn :)

Oh, mã ... trong giao diện:

<video autoplay="autoplay" preload="auto" ng-click="video()"> 
    <source src="{{ current.url }}" type="video/mp4" /> 
</video> 

Trong bộ điều khiển bên phải:

$scope.video = function() { 
    this.pause(); // ??? 
} 
+0

Câu hỏi đặt ra là rõ ràng và tôi xin bày tỏ bản thân mình sai? –

+0

Dường như đây là một câu hỏi hợp lý. Trước đó, không có mã hoặc định dạng nó trông giống như một downvote. Ai đó có thể giúp đỡ, tôi cũng không có kinh nghiệm với Angular. – elclanrs

+0

Tất nhiên. Được rồi cảm ơn. Trong AngularJS, tôi không thực sự hiểu triết lý về quản lý DOM (nhưng ... khó quên thói quen jQuery!) –

Trả lời

3

Làm thế nào về điều này:

Trong HTML của bạn, hãy đặt ng-click="video($event)"(đừng quênĐối số), gọi hàm sau:

$scope.video = function(e) { 
    var videoElements = angular.element(e.srcElement); 
    videoElements[0].pause(); 
} 

Tôi tin rằng đây là phương pháp đơn giản nhất.

Documentation for angular.element

Ngoài ra, đây có thể giúp bạn làm quen với góc: How do I “think in AngularJS/EmberJS(or other client MVC framework)” if I have a jQuery background?

+1

Cảm ơn! Bây giờ tôi hiểu cách thao tác DOM. Nhưng, mã này chỉ hoạt động nếu trong phương thức ng-click, tôi thêm "$ event" vào tham số và videoElement [0] .pause() ;. –

+0

Ồ, xin lỗi. Tôi đã chỉnh sửa câu trả lời của mình một chút, trông nó có đúng không? – sushain97

+2

Bạn không nên sử dụng chỉ thị để thao tác DOM? https://docs.angularjs.org/guide/directive – WrksOnMyMachine

7

Để kiểm soát đầy đủ, như hành vi và tìm & cảm thấy, tôi đang sử dụng videoJS trong góc. Tôi có chỉ thị ui-video bao bọc phần tử HTML5 video. Điều này là cần thiết để khắc phục sự cố tích hợp với AngularJS:

m.directive('uiVideo', function() { 
    var vp; // video player object to overcome one of the angularjs issues in #1352 (https://github.com/angular/angular.js/issues/1352). when the videojs player is removed from the dom, the player object is not destroyed and can't be reused. 
    var videoId = Math.floor((Math.random() * 1000) + 100); // in random we trust. you can use a hash of the video uri 

    return { 
     template: '<div class="video">' + 
      '<video ng-src="{{ properties.src }}" id="video-' + videoId + '" class="video-js vjs-default-skin" controls preload="auto" >' + 
       //'<source type="video/mp4"> '+  /* seems not yet supported in angular */ 
       'Your browser does not support the video tag. ' + 
      '</video></div>', 
     link: function (scope, element, attrs) { 
      scope.properties = 'whatever url'; 
      if (vp) vp.dispose(); 
      vp = videojs('video-' + videoId, {width: 640, height: 480 }); 
     } 
    }; 
}); 
3

Bạn cũng có thể xem xét dự án video của tôi.

https://github.com/2fdevs/videogular

Đó là một máy nghe nhạc video viết bằng AngularJS, vì vậy bạn sẽ có tất cả những lợi ích của các ràng buộc và các biến phạm vi. Ngoài ra, bạn có thể viết chủ đề và plugin của riêng mình.

1

Tôi cũng sử dụng videojs

bower install videojs --save

Tôi muốn sử dụng chỉ thị của tôi trong một ng-repeat và với một đối tượng phạm vi, vì vậy ... đây là phiên bản của tôi về nó với đạo cụ để Eduard trên. Dường như tôi không gặp sự cố với việc xử lý trình phát video, nhưng source tag issue referenced là một vấn đề thực tế.

Tôi cũng đã quyết định viết câu trả lời này làm câu trả lời để tôi có thể đưa ra ví dụ về cách người ta có thể muốn xử lý sự kiện videoj.

QUAN TRỌNG! Xin lưu ý tôi đang sử dụng Angular.js với các mẫu Jinja2, vì vậy tôi phải thay đổi các điểm đánh dấu nội suy HTML Angular của mình thành {[ ]} từ {{ }} trong trường hợp bất kỳ ai nhận thấy điều đó là lạ. Tôi sẽ bao gồm mã đó, vì vậy nó không phải là lạ cho bất cứ ai.

Interpolation tinh chỉnh

app.config(['$interpolateProvider', function($interpolateProvider) { 
    $interpolateProvider.startSymbol('{['); 
    $interpolateProvider.endSymbol(']}'); 
}]); 

Chỉ sử dụng

angular.module('myModule').directive('uiVideo', function() { 

    // Function for logging videojs events, possibly to server 
    function playLog(player, videoId, action, logToDb) { 
    action = action || 'view'; 
    var time = player.currentTime().toFixed(3); 

    if (logToDb) { 
     // Implement your own server logging here 
    } 

    // Paused 
    if (player.paused()) { 
     console.log('playLog: ', action + " at " + time + " " + videoId); 

    // Playing 
    } else { 
     console.log('playLog: ', action + ", while playing at " + time + " " + videoId); 
     if (action === 'play') { 
     var wrapFn = function() { 
      playLog(player, videoId, action, logToDb); 
     }; 
     setTimeout(wrapFn, 1000); 
     } 
    } 
    } 

    return { 
    template: [ 
     '<div class="video">', 
     '<video id="video-{[ video.id ]}" class="video-js vjs-default-skin img-responsive" controls preload="none"', 
      ' ng-src="{[ video.mp4 ]}"', 
      ' poster="{[ video.jpg ]}"', 
      ' width="240" height="120">', 
     '</video>', 
     '</div>' 
    ].join(''), 
    scope: { 
     video: '=video', 
     logToDb: '=logToDb' 
    }, 
    link: function (scope, element, attrs) { 
     scope.logToDb = scope.logToDb || false; 

     var videoEl = element[0].children[0].children[0]; 
     var vp = videojs(videoEl, {}, 
     function(){ 
      this.on("firstplay", function(){ 
      playLog(vp, scope.video.id, 'firstplay', scope.logToDb); 
      }); 
      this.on("play", function(){ 
      playLog(vp, scope.video.id, 'play', scope.logToDb); 
      }); 
      this.on("pause", function(){ 
      playLog(vp, scope.video.id, 'pause', scope.logToDb); 
      }); 
      this.on("seeking", function(){ 
      playLog(vp, scope.video.id, 'seeking', scope.logToDb); 
      }); 
      this.on("seeked", function(){ 
      playLog(vp, scope.video.id, 'seeked', scope.logToDb); 
      }); 
      this.on("ended", function(){ 
      playLog(vp, scope.video.id, 'ended', scope.logToDb); 
      }); 
     } 
    ); 

    } 
    }; 
}); 

Chỉ HTML

<div ng-repeat="row in videos"> 
     <ui-video video="row"></ui-video> 
    </div>