Versione abbreviata: è necessario eseguire il binding all'evento filesAdded
dopo chiamando la funzione init()
.
il mio primo passo per il debug è stato afferrare the uncompressed version off github18 nov 2012. Una volta ottenuto ciò, ho potuto rintracciare il problema.
Quindi il problema principale sembrava essere che la chiamata a removeFile()
non veniva mai chiamata, ma perché?
removeFile()
è stata definita come:
removeFile: function (file) {
var i;
for (i = files.length - 1; i >= 0; i--) {
if (files[i].id === file.id) {
return this.splice(i, 1)[0];
}
}
}
Ok, piuttosto semplice, questo scorre la matrice dei file e se c'è un file che ha l'ID corrispondente allora chiamiamo la funzione di giunzione.
Quindi, che aspetto ha la giunzione?
splice()
è stata definita come:
splice:function (start, length) {
var removed;
// Splice and trigger events
removed = files.splice(start === undef ? 0 : start, length === undef ? files.length : length);
this.trigger("FilesRemoved", removed);
this.trigger("QueueChanged");
return removed;
}
destro, così che è dove l'evento FilesRemoved
avrebbe dovuto essere innescato, quindi perché no?
Torna alla funzione removeFile()
, come indicato, chiama solo splicing se viene trovato un ID corrispondente.
Quindi, il passo successivo è stato scoprire se la funzione removeFile è stata persino chiamata.
Inserimento console.log('removeFile called', files);
come prima linea ci ha dato l'output: removeFile called []
Hmmm, un array vuoto!
Ok, quindi, sembra che noi vincolanti per l'evento FilesAdded
si fermi è il comportamento normale, nessun problema. aggiungiamo semplicemente uploader.files.push(file)
al nostro binding FilesAdded
. ed ecco ed ecco. quando facciamo clic su Start, vengono inviati solo i file corretti.
Sta funzionando ... ma non del tutto.
Ho avuto un paio di collegamenti extra lì, solo per scopi di debug, uno di quelli era su QueueChanged
. questo ha registrato la quantità di file nella coda ogni volta che c'è stata una modifica.
Quello che ho notato è che il numero di file nella coda non rifletteva effettivamente che c'erano file rimossi dalla coda.
Quindi, un rapido console.log(uploader.files.length)
e questo ha confermato che c'era qualcos'altro che succedeva qui.
Il passaggio successivo è stato esaminare l'azione predefinita per l'aggiunta di file.
Guardando ho notato che gli sviluppatori hanno deciso di associarsi all'evento, facendo questo all'interno della funzione init. Una strana scelta guardandola dal mio punto di vista. Ma questa è la loro scelta.
Quindi, guardando all'interno della loro rilegatura avevano anche un files.push(file)
che significava ottenere tutti i file + duplicati dei file corretti nell'array.
Constatando che il legame che stava accadendo nel funzione init()
, ho rimosso il uploader.files.push(file)
dal mio legame, spostato il init()
chiamata a prima del mio FilesAdded
vincolante. e ora tutto funziona bene.
si prega di fornire qualche spiegazione per la vostra risposta. –
Aggiungere una descrizione o almeno commentare il codice in modo più informativo. – Leo