AngularJS Cordova Media Tidak Selalu Memutar Lagu Berikutnya

Saya menggunakan Ionic Framework dengan AngularJS dan Plugin Media ngCordova: http://ngcordova.com/docs/plugins/media/

Saat ini saya memiliki dua fungsi di pengontrol saya;

  1. Putar - fungsi ini memutar media src yang dipilih

      $scope.play = function(src) {
            media = $cordovaMedia2.newMedia(src, null, null, mediaStatusCallback);
            media.play(); 
            $scope.isPlaying = true;
            $ionicLoading.hide();
    
        }
      }
    
  2. Lagu Berikutnya - fungsi ini mendapatkan src lagu berikutnya dalam daftar dengan mencari indeks objek lagu saat ini dan memilih objek berikutnya dalam daftar.

    $scope.nextSong = function (song_id) {
            var index = $scope.allsongs.indexOf(song_id);
            if(index >= 0 && index < $scope.allsongs.length - 1) {
               $scope.nextsongid = $scope.allsongs[index + 1]
               $scope.playMusic($scope.nextsongid);  //the playMusic function just looks up the src of the song and parses to the play function
            }
    }
    

Berikut adalah fungsi playMusic yang dipanggil di atas:

    $scope.playMusic = function(music_id)
{
    myService.getSongInfo(music_id)
    .then(function(data){
      $scope.cursong = data.results;
      $scope.play($scope.cursong.src);
    });
};

Dan di template saya, tombol berikutnya hanya memanggil fungsi nextSong seperti dengan ID lagu saat ini:

<div class="next" ng-click="nextSong('{{cursong.id}}')"></div>

Masalah yang saya hadapi adalah ketika saya menekan tombol berikutnya untuk pertama kalinya, lagu berikutnya diputar, tetapi ketika saya menekannya lagi, lagu yang sama diputar lagi. Tampaknya nilai 'currsong' tidak diperbarui.

Seperti inilah tampilan array 'allsongs':

["1631922", "1502059", "1365874", "1607940", "1251204", "1233296", "1151847", "1119737", "1086438", "1078140", "1068172", "1065312", "845339", "799161", "316293", "306073", "299817", "1603940"]

Pembaruan: Saya mencoba menggunakan interval

Saya memiliki fungsi interval yang melompat ke lagu berikutnya ketika waktunya telah mencapai durasinya. Saya memanggil fungsi lagu berikutnya di sana dan berfungsi dengan sempurna.

    $scope.Timer = $interval(function () {

$scope.cursongduration = $scope.cursong.duration;
$scope.cursongid = $scope.cursong.id;


if($scope.currduration >= $scope.cursongduration){
    $scope.nextSong($scope.cursongid);
    }, 1000);
};

Jadi pertanyaan saya adalah mengapa memanggil nextSong melalui tombol template juga berfungsi? Bagi saya sepertinya cursong.id tidak diperbarui di template setelah 1 kali karena alasan yang aneh. Saya juga telah mencoba menggunakan variabel cursongid yang diatur dalam interval di tombol templat tetapi tidak berhasil:

<div class="next" ng-click="nextSong('{{cursongid}}')"></div>

person aqq    schedule 14.11.2015    source sumber


Jawaban (2)


Masalahnya bukan di cordova atau plugin media, saat memutar lagu harus mengupdate $scope.cursong.id agar klik selanjutnya bisa mengetahui lagu apa yang sedang diputar.

$scope.play = function(src) {
        $scope.cursong.id = src;
        media = $cordovaMedia2.newMedia(src, null, null, mediaStatusCallback);
        media.play(); 
        $scope.isPlaying = true;
        $ionicLoading.hide();

    }
  }

Saya berasumsi Anda telah mendeklarasikan $scope.cursong.id di suatu tempat di skrip Anda.

person Alan Rezende    schedule 14.11.2015
comment
Hal ini dilakukan dalam fungsi playMusic $scope.cursong diperbarui dengan info tentang lagu termasuk id dan src-nya. Silakan lihat pertanyaan yang diperbarui dengan kode untuk playMusic. - person aqq; 14.11.2015
comment
Bisakah Anda membagikan beberapa contoh pengembalian data.hasil - person Alan Rezende; 14.11.2015
comment
Objek { id: 1251204, status: selesai, stream_only: yes} streaming_url: cloudfrontlink - person aqq; 14.11.2015
comment
Masalah yang saya hadapi adalah ketika saya menekan tombol berikutnya untuk pertama kalinya, lagu berikutnya diputar, tetapi ketika saya menekannya lagi, lagu yang sama diputar lagi. Tampaknya nilai 'currsong' tidak diperbarui setelah kedua kalinya. - person aqq; 14.11.2015
comment
coba gunakan baris ini di fungsi nextSong var index = $scope.allsongs.indexOf(String(song_id)); - person Alan Rezende; 14.11.2015
comment
song_id sudah menjadi string. Masalah yang sama dengan baris itu - lagu berikutnya diputar dengan baik untuk pertama kalinya dan kemudian ketika tombol lagu berikutnya ditekan lagi, lagu berikutnya yang sama diputar. - person aqq; 14.11.2015
comment
Silakan lihat pertanyaan yang diperbarui. Memanggil nextSong berfungsi dengan baik selama fungsi interval tetapi dengan tombol templat, masih belum berhasil. - person aqq; 15.11.2015

Saya telah mengatasi masalah ini dengan membuat fungsi baru 'PlayNextSong' yang menyimpan $scope.cursong.id ke dalam cakupan baru 'cursongid' dan kemudian memanggil fungsi nextSong. Ini berfungsi dengan baik dalam kasus saya.

Fungsi:

$scope.playNextSong = function() {

    $scope.cursongid = $scope.cursong.id;
    $scope.nextSong($scope.cursongid);

}

Tombol:

<div class="next" ng-click="playNextSong()"></div>
person aqq    schedule 15.11.2015