Spotify Очистить список воспроизведения Перетаскивание

Когда вы перетаскиваете исполнителя в мое приложение на боковой панели, я создаю временный список воспроизведения. Каждый раз, когда я перетаскиваю нового исполнителя в свое приложение, он создает новый список после предыдущего, БЕЗ очистки старого. (Обратите внимание, что здесь отсутствует некоторый код, который, вероятно, не нужен).

Мой вопрос: как очистить или удалить текущий созданный плейлист, ТОГДА создать новый, каждый раз, когда я перетаскиваю исполнителя в свое приложение? Я подозреваю, что это нужно будет вызывать внутри getRelated()?

 models.application.addEventListener('dropped', sidebarDropEventListener);

 function sidebarDropEventListener() {
   for(var i = 0; i < models.application.dropped.length; i++){
      var draggedItem = models.application.dropped[i];
      updateFromDragged(draggedItem.uri);
   }
 }

 function updateFromDragged(droppedUri) {
   // If dropped item is an artist
   if(droppedUri.indexOf('artist') >= 0) {
      getRelated(droppedUri);
   } else {
      console.warn('Dropped item is not an artist');
   }
}

     // Build playlist
     function buildList(trackURIArray){
       var arr = trackURIArray;

       models.Playlist
        .createTemporary("myTempList_" + new Date().getTime())
        .done(function (playlist){ 

        playlist.load("tracks").done(function() {

          playlist.tracks.add.apply(playlist.tracks, arr).done(function(){
            // Create list
            var list = List.forCollection(playlist);

            // Populate DOM
            $('#playlistContainer').append(list.node);
            list.init();
          });
      });
    });
  }

    // Get Related
    function getRelated(artist_uri){

      models.Artist
      .fromURI(artist_uri)
      .load('related','name')
      .done(function (artist){

        artist.related.snapshot().done(function (snapshot){
          snapshot.loadAll().done(function (artists){

            var promises = [];

            for(var i = 0; i < artists.length; i++){
              var promise = getTopTrack(artists[i], 1);
              promises.push(promise);
            }

            models.Promise.join(promises)
              .done(function (tracks){
                buildList(tracks);
              })
              .fail(function (tracks){
                buildList(tracks);
              });
          });
        });
      });
    }

person cusejuice    schedule 11.11.2013    source источник


Ответы (3)


Я думаю, вы могли бы сохранить текущий список воспроизведения в локальном хранилище, а затем стереть его в функции перетаскивания. Что-то вроде этого в buildList:

localStorage.current_temp_playlist = playlist.uri;

Затем в updateFromDragged:

models.Playlist.removeTemporary(models.Playlist.fromURI(localStorage.current_temp_playlist));

Вы можете отдельно хранить плейлист где-нибудь, чтобы updateFromDragged мог просто получить к нему доступ.

person Thomas    schedule 11.11.2013

Что ж, учитывая структуру вашего кода, вы можете каждый раз удалять весь список воспроизведения внутри вашей функции buildList с помощью метода Playlist.removeTemporary[1]:

models.Playlist.removeTemporary("myTempList_yyyymmddhhmmss");

или вы можете создать список воспроизведения один раз, а затем каждый раз очищать его. Список воспроизведения имеет свойство, называемое дорожками, которое является коллекцией, у которой есть метод, называемый clear[2]. Однако, чтобы сделать это, вы должны помнить, что сначала нужно загрузить свойство треков. Это будет выглядеть примерно так:

models.Playlist.load('name','tracks')
    .done(function(loadedPlaylistToClear) {
        return loadedPlaylistToClear.tracks.clear();
    })
    .done(function(clearedPlaylist) {
        // add new tracks in here
    });

[1] https://developer.spotify.com/docs/apps/api/1.0/api-models-playlist.html#removeTemporary

[2] https://developer.spotify.com/docs/apps/api/1.0/api-models-collection.html#clear

person merlinc    schedule 12.11.2013

В итоге я создал глобальную переменную «tempList» вверху. Затем сохраните список воспроизведения внутри моей функции «buildList». Внутри «updateFromDragged» я просто использую «tempList.tracks.clear», чтобы очистить сохраненные треки плейлиста.

Должен ли я использовать «removeTemporary» и здесь?

var tempList;

  // Build playlist
  function buildList(trackURIArray){
    var arr = trackURIArray;
    var date = new Date().getTime();

    models.Playlist
      // prevents appending new tracks on refresh
      .createTemporary("myTempList_" + date)
      .done(function (playlist){ 

        // Store created playlist
        tempList = playlist;

        playlist.load("tracks").done(function() {

          playlist.tracks.add.apply(playlist.tracks, arr).done(function(){
            // Create list
            var list = List.forCollection(playlist, {
              style: 'rounded',
              layout: 'toplist'
            });

            // Hide loading
            $loading.hide();

            // Populate DOM
            $('#playlistContainer').append(list.node);
            list.init();
          });
      });
    });

function updateFromDragged(droppedUri) {

    // Clear out old tracks
    tempList.tracks.clear();

    // Remove the temporary ones not in use to reduce resource load
    models.Playlist.removeTemporary( models.Playlist.fromURI(tempList) );

    // If dropped item is an artist
    if(droppedUri.indexOf('artist') >= 0) {
      getRelated(droppedUri);
    } else {
        console.warn('Dropped item is not an artist');
    }    

  }
person cusejuice    schedule 12.11.2013