Pregunta

Tengo una lista de carpetas que pertenecen a un usuario, y quiero que ellos sean capaces de reordenar arrastrando y soltando.Puedo obtener la arrastrar-soltar para funcionar bien, pero no puedo averiguar cómo guardar los resultados.Estoy usando el análisis, y creo que eso significa que tengo que recuperar cada objeto, cambiar el orden de atributo y, a continuación, guardarla...pero eso no parece estar funcionando, ya que todos salen con el mismo fin.

Después de la clasificación y, a continuación, hacer .sortable('toArray'), tengo una matriz de carpeta ids, antecedido por la palabra "carpeta", por lo que se ve algo como ["folder_ab9gu3nd", "folder_kwkgiutyqo", "folder_s856skt8w"].

Por lo tanto, quiero guardar la carpeta ab9gu3nd con el orden 0, kwkgiutyqo con el fin de 1, y s856skt8w con el fin de 2.

Aquí está mi código ('resultado' es la matriz con la carpeta id):

        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();
                }
            });
        }

Cuando ejecuto esto, las carpetas, todos acaban con el fin de '2', como si el valor final de la ii fue utilizado para todos ellos.¿Cómo puedo evitar que esto suceda?Gracias!

¿Fue útil?

Solución

Usted está siendo engañado por dos cosas:

  1. Su vars dentro del bucle se izó a los alrededores de la función, que no son locales para el bucle.
  2. Su success los controladores se activan de forma asincrónica y son los cierres más exactamente el mismo folderOrder.

Para la primera, el bucle de la realidad se ve como esta tan lejos como JavaScript es que se trate:

function whateverItIsCalled() {
    var folderId, folderOrder, folder, query, ii;
    //...
    for(ii = 0; ii < result.length; ii++) {
        //...
        folderOrder = ii;
        //...
    }
    //...
}

tan sólo hay una folderOrder para toda la función y el bucle simplemente asigna ii en cada iteración.

El segundo problema es el de siempre "AJAX en un bucle de" problema:estás construyendo una serie de funciones anónimas que son los cierres sobre el mismo folderOrder variable.El resultado de ello es que todos los tres de sus success los controladores de terminar hace referencia a la misma folderOrder valor y, por el momento en que se activa, el bucle estará terminado y folderOrder tendrá su último valor del bucle;el último valor en tu caso es de dos.

Para resolver su problema, usted sólo tiene que conseguir por separado folderOrder los valores en las distintas success los controladores.Una forma es usar una función para generar el éxito de los controladores:

function makeSuccess(folderOrder) {
    return function(folder) {
        folder.set('order', folderOrder);
        folder.save();
    }
}

y luego:

query.get(folderId, {
    success: makeSuccess(folderOrder)
});

Otro enfoque común es el uso de un auto de ejecución de la función a fin de crear un distinto alcance para el bucle del cuerpo:

for(var ii = 0; ii < result.length; ii++)
    (function(ii) {
        // Same stuff you currently have...
    })(ii);

El enfoque que usted tome es una cuestión de preferencia personal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top