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!

È stato utile?

Soluzione

Sei stato ingannato da due cose:

  1. Il vars all'interno del ciclo sono issati circostanti, funzione, non sono locali per il ciclo.
  2. Il success i gestori che si sono attivati in modo asincrono e sono chiusure di oltre esattamente lo stesso folderOrder.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top