2016-04-18 1 views
0

Nous utilisons JackUp pour le téléchargement d'images ajax dans Rails. Nous l'avons choisi parce qu'il ne suppose pas grand-chose et qu'il est plutôt léger.Meilleure façon de créer un nombre inconnu d'instances JackUp

Après son code d'exemple, nous sommes arrivés avec quelque chose comme ceci:

let jackUp = new JackUp.Processor({ 
    path: '/images' 
    }); 

    jackUp.on('upload:imageRenderReady', (e, options) => { 
    options.image.attr("data-id", options.file.__guid__).css({ 
     border: "5px solid red" 
    }); 
    $('[data-behavior=image-block-container]').prepend(options.image); 

    }).on("upload:sentToServer", (e, options) => { 
    $(`img[data-id='${options.file.__guid__}']`).css({ 
     borderColor: 'yellow' 
    }); 

    }).on("upload:success", (e, options) => { 
    $(`img[data-id='${options.file.__guid__}']`).css({ 
     borderColor: "green" 
    }); 

    }).on("upload:failure", (e, options) => { 
    alert(`'${options.file.name}' upload failed; please retry`); 
    $(`img[data-id='${options.file.__guid__}']`).remove(); 
    }); 

    $('.file-drop').jackUpDragAndDrop(jackUp); 

    $(document).bind('drop dragover', e => { 
    e.preventDefault(); 
    }); 

Cela fonctionne exactement comme prévu avec un bouton de téléchargement d'image (classé file-drop). Cependant, une page aura un nombre inconnu de ces boutons de téléchargement d'image.

Lorsqu'il y a plusieurs boutons de téléchargement, chaque fois qu'un fichier est ajouté, il est ajouté à tous les éléments image-block-container, au lieu de simplement celui qui a été ciblé. Il semble que jackUp n'a aucune notion de l'élément qui l'a déclenché.


Quelle est la meilleure façon de permettre à chaque bouton de téléchargement de savoir ce qu'il a appelé? J'ai essayé de l'entourer dans un bloc .on('drop'.... Cela m'a donné accès à l'élément, mais aucun des événements de JackUp n'a été déclenché.

Toute aide ou conseil pour une gemme de téléchargement ajax Rails-friendly est appréciée!

Répondre

0

Vous correspondez largement à plusieurs parties de votre DOM avec ce sélecteur de requête: $('[data-behavior=image-block-container]'). Plusieurs éléments correspondant à ce sélecteur sont probablement la cause de votre problème de mise à jour bizarre.

Si vous souhaitez cibler simplement l'élément que l'utilisateur a été en interaction avec la variable e dans le gestionnaire d'événements upload:imageRenderReady doit avoir une [target][1] qui est généralement ce que l'utilisateur a été en interaction avec et si vous se rapprocher de ce que vous voulez (en fonction de la structure de votre DOM).

De jQuery:

La propriété cible peut être l'élément qui a enregistré pour l'événement ou un descendant de celui-ci.

+0

'e' dans' upload: imageRenderReady' semble n'avoir aucune référence à l'interaction de l'utilisateur. Voici à quoi ressemble 'e': http://puu.sh/omnI9/650cdf2fd7.png et ceci est' e.target' http://puu.sh/omnLR/015ff297f3.png. Faites-moi confiance, rien dans 'e.target, currentTarget ou delegateTarget' n'a de référence à un élément DOM. Ils semblent tous faire référence à 'jQuery11210678854975767535' mais je ne peux pas comprendre ce que c'est. Quand je regarde dans l'objet 'jQuery112 ...', il n'y a rien de remarquable. –

+0

Je suppose que vous avez également regardé l'argument 'options'? Je pense qu'il aura 'image' et' file': https://github.com/thoughtbot/jack_up/blob/master/lib/assets/javascripts/jack_up/processor.coffee#L28 - Vous pourrez peut-être utiliser ' options.image.parentNode' ou 'options.image.parentNode.parentNode' ... A défaut, vous devrez peut-être créer une instance JackUp séparée pour chaque téléchargement et utiliser les conventions DOM ID (par exemple' id = "imageupload-01" ') pour différencier les sélecteurs pour chacun. Le repo semble vieux - de nombreux PR de l'année dernière qui ne sont pas fusionnés. – pherris

+0

Merci pour le conseil! J'ai fini par forker le repo et le modifier pour avoir cette fonctionnalité. –