Spotify 清除播放列表拖放
Posted
技术标签:
【中文标题】Spotify 清除播放列表拖放【英文标题】:Spotify Clear Playlist Drag and Drop 【发布时间】:2013-11-22 18:24:37 【问题描述】:当您在边栏中将艺术家拖放到我的应用程序中时,我会构建一个临时播放列表。每次我将新艺术家拖入我的应用程序时,它都会在前一个艺术家之后构建一个新列表,而不会清除旧列表。 (注意这里缺少一些可能不需要的代码)。
我的问题:每次我将艺术家拖放到我的应用程序中时,如何清除或删除当前构建的播放列表然后构建一个新的播放列表?我怀疑它需要在 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);
);
);
);
);
【问题讨论】:
【参考方案1】:我认为您可以将当前播放列表存储到本地存储,然后在删除功能中将其删除。 buildList 中的类似内容:
localStorage.current_temp_playlist = playlist.uri;
然后在 updateFromDragged:
models.Playlist.removeTemporary(models.Playlist.fromURI(localStorage.current_temp_playlist));
您可以单独将播放列表存储在 updateFromDragged 可以访问的地方。
【讨论】:
【参考方案2】:好吧,鉴于您的代码结构,您可以通过 Playlist.removeTemporary 方法 [1] 每次在 buildList 函数中删除整个播放列表:
models.Playlist.removeTemporary("myTempList_yyyymmddhhmmss");
或者您可以创建一次播放列表,然后每次清除播放列表。播放列表有一个名为 track 的属性,它是一个 Collection,它有一个名为 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
【讨论】:
【参考方案3】:我最终做的是在顶部创建一个全局变量“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');
【讨论】:
以上是关于Spotify 清除播放列表拖放的主要内容,如果未能解决你的问题,请参考以下文章
使用NoteBurner Spotify Music Converter在 Spotify 上制作协作播放列表