Когда вы перетаскиваете Artist в мое приложение на боковой панели, я создаю временный список воспроизведения. Каждый раз, когда я перетаскиваю нового исполнителя в мое приложение, он создает новый список после предыдущего, БЕЗ очистки старого. (Обратите внимание, что здесь отсутствует какой-то код, который, вероятно, не нужен).
Мой вопрос: как очистить или удалить текущий встроенный плейлист THEN построить новый, каждый раз, когда я перетаскиваю Artist в мое приложение? Я подозреваю, что его нужно будет вызвать внутри 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);
});
});
});
});
}
В итоге я создал глобальную переменную 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');
}
}
Ну, учитывая вашу структуру кода, вы можете либо удалить весь список воспроизведения каждый раз в своей функции 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
Я думаю, вы могли бы сохранить текущий список воспроизведения в localstorage, а затем удалить его в функции drop. Что-то вроде этого в buildList:
localStorage.current_temp_playlist = playlist.uri;
Затем в updateFromDragged:
models.Playlist.removeTemporary(models.Playlist.fromURI(localStorage.current_temp_playlist));
Вы можете отдельно хранить плейлист где-то, что updateFromDragged может просто получить к нему доступ.