Kurzfassung: Sie müssen das filesAdded
Ereignis binden nach Aufruf der init()
Funktion.
mein erster Schritt für das Debuggen war the uncompressed version off github18. November 2012 zu greifen. Sobald ich das hatte, konnte ich das Problem verfolgen.
Also das primäre Problem schien zu sein, dass der Anruf an removeFile()
wurde nie aufgerufen, aber warum?
removeFile()
wurde wie folgt definiert:
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, ziemlich einfach, diese die Dateien Array durchläuft und wenn es eine Datei, die die passende ID hat, ist dann rufen wir die Spleiß-Funktion.
Also, wie sieht Spleiß aus?
splice()
wurde wie folgt definiert:
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;
}
Richtig, das ist so, wo das FilesRemoved
Ereignis ausgelöst worden sein, so war, warum es nicht?
Zurück in der removeFile()
Funktion, wie erwähnt, ruft es nur Spleiß , wenn eine übereinstimmende ID gefunden wird.
Der nächste Schritt war also herauszufinden, ob die removeFile-Funktion überhaupt aufgerufen wurde.
Einfügen console.log('removeFile called', files);
als die erste Zeile hat uns die Ausgabe: removeFile called []
Hmmm, ein leeres Array!
Ok dann, Sieht aus, als ob uns die Bindung an das FilesAdded
Ereignis stoppt sein übliches Verhalten, kein Problem. Lassen Sie uns einfach uploader.files.push(file)
zu unserer FilesAdded
Bindung hinzufügen. und siehe da. Wenn wir auf Start klicken, werden nur die richtigen Dateien gesendet.
Es funktioniert ... aber nicht ganz.
Ich hatte ein paar zusätzliche Bindungen, nur für Debugging-Zwecke, eine davon war auf QueueChanged
. Dies protokollierte die Anzahl der Dateien in der Warteschlange bei jeder Änderung.
Was ich bemerkte war, dass die Anzahl der Dateien in der Warteschlange nicht wirklich widerspiegelte, dass Dateien aus der Warteschlange entfernt wurden.
Also, eine schnelle console.log(uploader.files.length)
und dies bestätigt, dass hier noch etwas anderes los war.
Der nächste Schritt war, zu sehen, was die Standardaktion zum Hinzufügen von Dateien war.
Als ich bemerkte, dass die Entwickler beschlossen, auch an das Ereignis zu binden, tun dies innerhalb der Init-Funktion. Eine seltsame Wahl, die es aus meiner Perspektive betrachtet. Aber das ist ihre Wahl.
Also, in ihre Bindung schauen sie hatten auch eine files.push(file)
bedeutet, dass wir alle Dateien + Duplikate der richtigen Dateien im Array bekommen.
Anbetracht dessen, dass die Bindung geschah in der init()
, Funktion, Ich entfernte die uploader.files.push(file)
aus meiner Bindung, zog die init()
Aufruf vor meiner FilesAdded
verbindlich. und jetzt funktioniert alles gut.
bitte erläutern Sie Ihre Antwort. –
Fügen Sie eine Beschreibung hinzu oder kommentieren Sie den Code informativer. – Leo