2017-04-16 55 views
0

我正在創建一個音板,當單擊一個按鈕時它會播放隨機聲音。我試圖通過在獲取所有mp3文件鏈接(文件名)的for循環中創建數組來完成此操作,並且當用戶單擊按鈕時使用(Math.floor(Math.random))更改文件名稱。從for循環獲取隨機值(角度2)

我遇到的問題是,它只是發揮相同的聲音。它不會播放隨機聲音。

soundboard.ts

/* Loop through them, saving their title and sound file */ 
      for(let link of links) { 
      let filename = link.getAttribute("href")    
      let rand = [filename]; 
      this.sounds.push({ 
       file: filename, 
       rand: rand 
      }); 
      } 

    /* Plays the sound */ 
     play(sound) {  
      sound.rand = sound.file[Math.floor(Math.random() * sound.file.length)]; 
      console.log(sound.rand) 
      this.media = new Audio(sound.rand); 
      this.media.load(); 
      this.media.play(); 
     } 
+0

您的代碼很難閱讀。你在錯誤的地方有類型。 'let rand:any = [filename];'是_terrible_代碼。另一方面,'play(sound){'實際上可以使用類型註釋.... –

+0

無論如何,你是不是指'const randomSound = sounds [Math.floor(Math.random()* sound.file。 ''this.media = new Audio(randomSound);'爲什麼'rand'初始化爲一個元素的數組? –

回答

1

似乎有一個邏輯錯誤。根據你的問題描述,我認爲你想要類似於

export class Component { 
    soundFileNames: string[] = []; 

    media?: Audio; 

    ngOnInit() { 
    for (const link of links) { 
     const fileName = link.getAttribute("href"); 
     soundFileNames.push(fileName);  
    } 
    } 

    playRandomSoundFile() { 
    const randomIndex = Math.floor(Math.random() * soundFileNames.length); 
    const randomFileName = soundFileNames[randomIndex]; 
    console.log(randomFileName); 
    const audio = new Audio(randomFileName); 
    audio.load(); 
    audio.play(); 
    this.media = audio; 
    } 
} 
+0

像一個魅力工作,謝謝 –

-1

我覺得使用「underscorejs」庫對於這些常用功能總是更好。在你的情況下,你試圖從數組中獲得隨機值,你可以通過下面的「underscorejs」來實現。

import * as _ from 'underscore'; 

getRandomElementFromArray (sounds) { 
    let randomNumber = _.random(0, sounds.length); 
    return sounds[randomNumber]; 
}