AngularJS Cordova Media не всегда воспроизводит следующую песню

Я использую Ionic Framework с AngularJS и плагином ngCordova Media: http://ngcordova.com/docs/plugins/media/

В настоящее время у меня есть две функции в моем контроллере;

  1. Воспроизведение — эта функция воспроизводит выбранный источник мультимедиа.

      $scope.play = function(src) {
            media = $cordovaMedia2.newMedia(src, null, null, mediaStatusCallback);
            media.play(); 
            $scope.isPlaying = true;
            $ionicLoading.hide();
    
        }
      }
    
  2. Следующая песня — эта функция получает src следующей песни в списке, просматривая индекс текущего объекта песни и выбирая следующий объект в списке.

    $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
            }
    }
    

Вот функция playMusic, которая вызывается выше:

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

И в моем шаблоне кнопка next просто вызывает функцию nextSong с текущим идентификатором песни:

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

Проблема, с которой я столкнулся, заключается в том, что когда я нажимаю следующую кнопку в первый раз, она воспроизводит следующую песню, но когда я нажимаю ее снова, она снова воспроизводит ту же песню. Кажется, что значение currsong не обновляется.

Вот как выглядит массив allsongs:

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

Обновление: я пытался использовать интервал

У меня есть функция интервала, которая переходит к следующей песне, когда время достигает продолжительности. Я вызываю там функцию nextsong, и она отлично работает.

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

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


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

Итак, мой вопрос: почему вызов nextSong через кнопку шаблона также работает? Мне кажется, что cursong.id не обновляется в шаблоне после 1 раза по какой-то странной причине. Я также пытался использовать переменную cursongid, которая установлена ​​в интервале в кнопке шаблона, но не повезло:

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

person aqq    schedule 14.11.2015    source источник


Ответы (2)


Проблема не в кордове или медиа-плагине, когда вы воспроизводите песню, вам нужно обновить $scope.cursong.id, чтобы при следующем щелчке можно было узнать, какая песня текущая.

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

    }
  }

Я предполагаю, что вы объявили $scope.cursong.id где-то в своем скрипте.

person Alan Rezende    schedule 14.11.2015
comment
Это делается в функции playMusic. $scope.cursong обновляется информацией о песне, включая ее идентификатор и источник. См. обновленный вопрос с кодом для playMusic. - person aqq; 14.11.2015
comment
Можете ли вы поделиться примером возврата data.results - person Alan Rezende; 14.11.2015
comment
Объект { id: 1251204, статус: завершен, stream_only: yes} streaming_url: cloudfrontlink - person aqq; 14.11.2015
comment
Проблема, с которой я столкнулся, заключается в том, что когда я нажимаю следующую кнопку в первый раз, она воспроизводит следующую песню, но когда я нажимаю ее снова, она снова воспроизводит ту же песню. Кажется, что значение currsong не обновляется после второго раза. - person aqq; 14.11.2015
comment
попробуйте использовать эту строку в функции nextSong var index = $scope.allsongs.indexOf(String(song_id)); - person Alan Rezende; 14.11.2015
comment
song_id уже является строкой. Та же проблема с этой строкой - она ​​воспроизводит следующую песню в первый раз, а затем, когда кнопка следующей песни нажимается снова, она воспроизводит ту же следующую песню. - person aqq; 14.11.2015
comment
Пожалуйста, смотрите обновленный вопрос. Вызов nextSong отлично работает во время функции interval, но с кнопкой шаблона все равно не повезло. - person aqq; 15.11.2015

Я решил эту проблему, создав новую функцию PlayNextSong, которая сохраняет $scope.cursong.id в новую область видимости cursongid, а затем вызывает функцию nextSong. Это отлично работает в моем случае.

Функция:

$scope.playNextSong = function() {

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

}

Кнопка:

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