src 값을 오디오 파일 배열의 각 인덱스에 대해 지시문 범위 변수에 동적으로 바인딩하는 방법

사브리나

AngularJS 애플리케이션에서 D3.js와 Web Audio API를 사용하여 음악 주파수 비주얼 라이저를 사용했습니다.

지시문과 templateUrl html 파일이있는 내부에 사용자 정의 bower 구성 요소를 만들었습니다.

Directive.js

(function (angular) {
	var ap=angular.module('audio-player-mod',[]);

	ap.directive('audioPlayer', function () {
		 return {
		    restrict: 'EA',
		    scope: {
		      audioFile : "="		      
		    },
		link: function (scope,element,attrs) {
			$(document).ready(function () {				
			
			// scope.audios=scope.audioFile;
			console.log(scope.audioFile);
			  
			  var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
			  var audioElement = document.getElementById('audioElement');
			  var audioSrc = audioCtx.createMediaElementSource(audioElement);
			  var analyser = audioCtx.createAnalyser();
  
			  // Bind our analyser to the media element source.
			  audioSrc.connect(analyser);
			  audioSrc.connect(audioCtx.destination);

			  //var frequencyData = new Uint8Array(analyser.frequencyBinCount);
			  var frequencyData = new Uint8Array(200);

			  var svgHeight = '500';
			  var svgWidth = '2000';
			  var barPadding = '1';

			  function createSvg(parent, height, width) {
			    return d3.select(parent).append('svg').attr('height', height).attr('width', width);
			  }

			  var svg = createSvg('body', svgHeight, svgWidth);

			  // Create our initial D3 chart.
			  svg.selectAll('rect')
			     .data(frequencyData)
			     .enter()
			     .append('rect')
			     .attr('x', function (d, i) {
			        return i * (svgWidth / frequencyData.length);			
			     })
			     .attr('width', svgWidth / frequencyData.length - barPadding);

			  // Continuously loop and update chart with frequency data.
			  function renderChart() {
			     requestAnimationFrame(renderChart);

			     // Copy frequency data to frequencyData array.
			     analyser.getByteFrequencyData(frequencyData);

			     // Update d3 chart with new data.
			     svg.selectAll('rect')
			        .data(frequencyData)
			        .attr('y', function(d) {
			           return svgHeight - d;
			        })
			        .attr('height', function(d) {
			           return d;
			        })
			        .attr('fill', function(d) {
			           return 'rgb(0, 0, ' + d + ')';
			        });
			  }

			  // Run the loop
			  renderChart();

			});

		
		},
		    templateUrl: 'bower_components/audio-player/view/audio-player.html'
		};
	});

})(angular);

templateUrl.html (여기는 audio-player.html)

<div>
 	<audio id="audioElement" crossorigin="anonymous" src="audioFile"></audio>
    <div>
      <button onclick="document.getElementById('audioElement').play()">Play</button>
      <button onclick="document.getElementById('audioElement').pause()">Pause</button>
      <button onclick="document.getElementById('audioElement').volume+=0.1">Increase Volume</button>
      <button onclick="document.getElementById('audioElement').volume-=0.1">Decrease Volume</button>
    </div>
    </div>

이 audioPlayer 지시문은 뷰의 다른 html 파일에서 사용되며 아래에 표시된 코드

<div class="player-region" ng-if="recordingsCtrl.audioList[0].src">
    <div>
    <div class="player-control">
      <div class="player-control-bottom">
        <audio-player crossorigin="anonymous" audio-file="recordingsCtrl.audioList[0].src"></audio-player>
      </div>
    </div>
    </div>
  </div>

여기서 audio-player 태그의 src 값은 directive.js (지시문의 이름은 audioPlayer 임) 파일에서 액세스 할 수 있습니다.

보기에서 {{audioFile}} 인쇄를 시도했는데 각 오디오 색인에 대한 URL이 표시됩니다.

문제는 지시어 범위 변수에서 src 값을 어떻게 얻을 수 있습니까? 첫 번째 클릭으로 얻었지만 다른 인덱스를 클릭하면 범위가 해당 src 값으로 업데이트되지 않습니다!

사브리나

지시문을 다시로드하고 html 파일에 플래그를 설정했습니다.

<div ng-if="recordingsCtrl.songChanged">
        <audio-player  crossorigin="anonymous" audio-file="recordingsCtrl.audioList[0].src"></audio-player>
      </div>

모든 오디오 파일을 클릭 할 때 타임 아웃 기능을 설정합니다.

function playAudio{
self.songChanged = false;
      setTimeout(function() {
        self.songChanged = true;
        $scope.$apply();
      }, 10);
  
  }

처음로드 된 윈도우의 경우 지시문이 html에 바인드되고 지시문 범위 변수를 변경하려면 위와 같이 지시문을 다시로드하여 수행 할 수 있습니다.

이것이 우리가 문제를 해결할 수있는 방법 중 하나입니다. 더 나은 해결책이있는 사람이 있으면 아래에 답해주세요.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관