Come faccio a salvare un oggetto in ordine Parse.com / backbone.js
-
13-12-2019 - |
Domanda
Ho un elenco di cartelle appartenenti ad un utente, e voglio essere in grado di riordinare trascinando e rilasciando.Posso ottenere il drag-drop per lavoro ok, ma io non riesco a capire come salvare i risultati.Io sto usando da Analizzare, e penso che significa che devo recuperare ogni oggetto, modificare l'ordine di attributo, e quindi salvarlo...ma che non sembra essere al lavoro, come tutti escono con lo stesso ordine.
Dopo la cernita e poi facendo .ordinabile('toArray'), ho un array di id cartella, anteposto la parola "cartella", quindi sembra qualcosa di simile ["folder_ab9gu3nd", "folder_kwkgiutyqo", "folder_s856skt8w"].
Quindi, voglio salvare la cartella ab9gu3nd con ordine 0, kwkgiutyqo con ordine 1, e s856skt8w con ordine 2.
Ecco il mio codice ('risultato' è l'array con gli id cartella):
for(var ii=0; ii<result.length; ii++) {
// Get actual id
var folderId = result[ii].replace('folder_', '');
var folderOrder = ii;
var folder = Parse.Object.extend("Folder");
var query = new Parse.Query(folder);
query.get(folderId, {
success: function(folder) {
// The object was retrieved successfully.
folder.set('order', folderOrder);
folder.save();
}
});
}
Quando si esegue questa operazione, le cartelle di tutti finiscono con l'ordine '2', come se il valore finale del ii è stato utilizzato per tutti loro.Come posso evitare questo problema?Grazie!
Soluzione
Sei stato ingannato da due cose:
- Il
var
s all'interno del ciclo sono issati circostanti, funzione, non sono locali per il ciclo. - Il
success
i gestori che si sono attivati in modo asincrono e sono chiusure di oltre esattamente lo stessofolderOrder
.
Per il primo, il ciclo sembra in realtà come questo per quanto riguarda JavaScript è interessato:
function whateverItIsCalled() {
var folderId, folderOrder, folder, query, ii;
//...
for(ii = 0; ii < result.length; ii++) {
//...
folderOrder = ii;
//...
}
//...
}
quindi c'è una sola folderOrder
per tutta la funzione e il ciclo assegna semplicemente ii
a ogni iterazione.
Il secondo problema è il solito "AJAX in un ciclo" problema:si sta costruendo una serie di funzioni anonime che sono le chiusure di oltre lo stesso folderOrder
variabile.Il risultato è che tutte e tre le success
i gestori di finire riferimento alla stessa folderOrder
valore e, dal momento in cui sono attivati, il ciclo sarà finito e folderOrder
avrà il suo ultimo valore dal ciclo;l'ultimo valore nel tuo caso è di due.
Per risolvere il tuo problema, hai solo bisogno di ottenere separata folderOrder
i valori nelle varie success
i gestori.Un modo è quello di utilizzare una funzione per generare il vostro successo gestori:
function makeSuccess(folderOrder) {
return function(folder) {
folder.set('order', folderOrder);
folder.save();
}
}
e poi:
query.get(folderId, {
success: makeSuccess(folderOrder)
});
Un altro approccio comune è quello di utilizzare un auto-eseguire la funzione in modo efficace la creazione di un distinto ambito per il ciclo del corpo:
for(var ii = 0; ii < result.length; ii++)
(function(ii) {
// Same stuff you currently have...
})(ii);
Quale approccio si prende, è una questione di preferenze personali.