So sieht mein Eingabe-Tag aus:
<input type="file" placeholder="File Name" name="filename" (change)="onChange($event)">
<button>Reset</button>
Ich möchte die ausgewählte Datei in Angular 2 zurücksetzen. Hilfe wäre sehr dankbar. Lassen Sie mich wissen, wenn Sie weitere Details benötigen.
PS
Ich könnte Dateidetails von $event
Parametern abrufen und in einer Typoskriptvariablen speichern, aber diese Variable ist nicht an das Eingabe-Tag gebunden.
Antworten:
Sie können
ViewChild
damit auf die Eingabe in Ihrer Komponente zugreifen. Zuerst müssen Sie#someValue
Ihre Eingabe ergänzen , damit Sie sie in der Komponente lesen können:<input #myInput type="file" placeholder="File Name" name="filename" (change)="onChange($event)">
Dann müssen Sie in Ihrer Komponente importieren
ViewChild
aus@angular/core
:import { ViewChild } from '@angular/core';
Anschließend können Sie
ViewChild
auf die Eingabe aus der Vorlage zugreifen:@ViewChild('myInput') myInputVariable: ElementRef;
Jetzt können Sie
myInputVariable
die ausgewählte Datei zurücksetzen, da es sich um eine Referenz für die Eingabe handelt#myInput
, z. B. um eine Erstellungsmethodereset()
, die beimclick
Ereignis Ihrer Schaltfläche aufgerufen wird :reset() { console.log(this.myInputVariable.nativeElement.files); this.myInputVariable.nativeElement.value = ""; console.log(this.myInputVariable.nativeElement.files); }
Erstens
console.log
wird die ausgewählte Dateiconsole.log
gedruckt , zweitens wird ein leeres Array gedruckt, dathis.myInputVariable.nativeElement.value = "";
ausgewählte Datei (en) aus der Eingabe gelöscht werden. Wir müssen verwendenthis.myInputVariable.nativeElement.value = "";
, um den Wert der Eingabe zurückzusetzen, da dasFileList
Attribut der Eingabe schreibgeschützt ist , sodass es unmöglich ist, nur ein Element aus dem Array zu entfernen. Hier arbeitet Plunker .quelle
this.myInputVariable.nativeElement.value = "";
myInputVariable
ist in der Tat vom TypElementRef
Winkel 5
html
Vorlage
Taste ist nicht erforderlich. Sie können es nach dem Änderungsereignis zurücksetzen, es dient nur zur Demonstration
quelle
Eine Möglichkeit, dies zu erreichen, besteht darin, Ihre Eingabe in ein
<form>
Tag zu verpacken und zurückzusetzen.Ich denke nicht darüber nach, die Form an
NgForm
oderFormControl
anzubringen.https://plnkr.co/edit/Ulqh2l093LV6GlQWKkUA?p=preview
quelle
.reset()
Können wir die Methode für viewChild verwenden?Normalerweise setze ich meine Dateieingabe zurück, nachdem ich die ausgewählten Dateien erfasst habe. Sie müssen keinen Knopf drücken, Sie haben alles, was für das
$event
Objekt erforderlich ist, an das Sie übergebenonChange
:Unterschiedlicher Workflow, aber das OP erwähnt nicht, dass das Drücken einer Taste eine Voraussetzung ist ...
quelle
Kurzversion Plunker :
Und ich denke, häufiger ist es, keine Taste zu verwenden, sondern automatisch zurückzusetzen. Angular Template-Anweisungen unterstützen Verkettungsausdrücke, sodass Plunker :
Und interessanter Link darüber, warum es keine Rekursion zur Wertänderung gibt.
quelle
Ich denke, es ist einfach, verwenden Sie #variable
Option "variable.value = null" ebenfalls verfügbar
quelle
In meinem Fall habe ich es wie folgt gemacht:
Ich setze es mit #fileInput in HTML zurück, anstatt ein ViewChild in component.ts zu erstellen. Wenn auf die Schaltfläche "Datei hochladen" geklickt wird, wird zuerst der #fileInput zurückgesetzt und dann die
#fileInput.click()
Funktion ausgelöst . Wenn zum Zurücksetzen eine separate Schaltfläche erforderlich ist,#fileInput.value=''
kann diese beim Klicken ausgeführt werden.quelle
Vorlage:
Komponente:
quelle
Wenn Sie Probleme mit dem Hochladen von ng2-Dateien haben,
HTML:
Komponente
quelle
Ich habe dieses Eingabe-Tag zum Formular-Tag hinzugefügt.
Ich habe eckiges Typoskript, ich habe unten Zeilen hinzugefügt, bekomme deine Formular-ID in Dokumentformularen und mache diesen Wert als null.
Drucken Sie document.forms in der Konsole und Sie können sich ein Bild machen.
quelle
Sie können die Vorlagenreferenzvariable verwenden und an eine Methode senden
html
Komponente
quelle
Ich benutze einen sehr einfachen Ansatz. Nachdem eine Datei hochgeladen wurde, entferne ich kurz das Eingabesteuerelement mit * ngIf. Dies führt dazu, dass das Eingabefeld aus dem Dom entfernt und erneut hinzugefügt wird. Infolgedessen handelt es sich um ein neues Steuerelement, und daher ist es einfach:
showUploader: boolean = true; async upload($event) { await dosomethingwiththefile(); this.showUploader = false; setTimeout(() =>{ this.showUploader = true }, 100); }
<input type="file" (change)="upload($event)" *ngIf="showUploader">
quelle
<input type="file" id="image_control" (change)="validateFile($event)" accept="image/gif, image/jpeg, image/png" />
quelle