Angular2-Formular senden durch Drücken der Eingabetaste ohne Senden-Taste


99

Ist es möglich, ein Formular ohne Senden-Schaltfläche (durch Drücken der Eingabetaste) zu senden? Beispiel:

<form [ngFormModel]="xxx" (ngSubmit)="xxxx()">
  <input [(ngModel)]="lxxR"   ngControl="xxxxx"/>
</form

Antworten:


77

Vielleicht fügen Sie keypressoder keydownzu den Eingabefeldern hinzu und weisen das Ereignis der Funktion zu, die das Senden durch Klicken auf die Eingabetaste ausführt

Ihre Vorlage würde so aussehen

<form (keydown)="keyDownFunction($event)">
  <input type="text" />
</form

Und Sie funktionieren innerhalb Ihrer Klasse würde so aussehen

keyDownFunction(event) {
  if (event.keyCode === 13) {
    alert('you just pressed the enter key');
    // rest of your code
  }
}

206

Sie können auch hinzufügen (keyup.enter)="xxxx()"


Dies funktioniert hervorragend, wenn Sie nur eine einfache alte Funktion haben, die Sie anstelle eines Submit-Handlers aufrufen möchten
— Scott R. Frost

3
Dieser Ansatz wurde in Angular-Dokumenten erwähnt. angle.io/docs/ts/latest/guide/…
— trungk18

Nur so funktioniert es in meiner Situation, danke!
— Switch87

5
Dies sollte die akzeptierte Antwort sein. Eleganz nur so, wie Angular es erreichen kann. Brillant.
— Scott Byers

Neue Erwähnung in der Angular-Dokumentation: angle.io/guide/user-input#key-event-filtering-with-keyenter
— Rafael Neto

83

Bearbeiten:

  <form (submit)="submit()" >
    <input />
    <button type="submit" style="display:none">hidden submit</button>
  </form>

Um diese Methode verwenden zu können, benötigen Sie eine Senden-Schaltfläche, auch wenn nicht "Danke für die Antwort von Toolkit " angezeigt wird.

Alte Antwort:

Ja, genau so, wie Sie es geschrieben haben, außer dass der Ereignisname (submit)anstelle von (ngSubmit):

<form [ngFormModel]="xxx" (submit)="xxxx()">
  <input [(ngModel)]="lxxR"   ngControl="xxxxx"/>
</form>


2
Können Sie bitte einen Plunker zur Verfügung stellen? weil es nicht funktioniert
— Toolkit

Verwenden Sie "Sichtbarkeit: versteckt;" stattdessen. Die "Anzeige: keine;" arbeitete in Chrom, aber nicht in Safari.
— Moulde

Dies sollte verwendet werden, außer dass die Senden-Schaltfläche nicht ausgeblendet, sondern sichtbar sein sollte, da einige Leute nach dieser Schaltfläche suchen und sich nicht die Mühe machen, die Eingabetaste zu drücken.
— Impulse The Fox

31

Ich bevorzuge, (keydown.enter)="mySubmit()"weil kein Zeilenumbruch hinzugefügt wird, wenn sich der Cursor irgendwo innerhalb von a befindet, <textarea>aber nicht am Ende.


1
Dies sollte die akzeptierte Lösung sein - viel sauberer
— Rhysclay

27

Dieser Weg ist sehr einfach ...

<form [formGroup]="form" (keyup.enter)="yourMethod(form.value)">

</form>

2
Danke, es ist einfacher, als ich erwartet hatte. So gelöst: <input type = "text" class = "form-control" [(ngModel)] = "object.LanguageTableData" (blur) = "mymethod ()" (keyup.enter) = "mymethod ()" / >
— Loutocký

1
Auf diese Weise viel einfacher, als eine Funktion mit $ event zu senden. Danke dir!
— Helen

1
viel besser. keine versteckten Tasten oder js. Reiner eckiger Weg
— RenanSS

10

Verwenden Sie immer keydown.enter anstelle von keyup.enter, um Verzögerungen zu vermeiden.

<textarea [(ngModel)]="textValue" (keydown.enter)="sendMessage();false" ></textarea>

und Funktion innerhalb der Komponente.ts

 textValue : string = '';  
 sendMessage() {
    console.log(this.textValue);
    this.textValue = '';
  }

10

Fügen Sie dies in Ihr Eingabe-Tag ein

<input type="text" (keyup.enter)="yourMethod()" />

Danke Bruder. Ich bevorzuge diese Option gegenüber der ausgewählten Antwort.
— Santosh

7

Das Hinzufügen einer unsichtbaren Schaltfläche zum Senden reicht aus

<input type="submit" style="display: none;">


Verwenden Sie "Sichtbarkeit: versteckt;" stattdessen. Das obige funktionierte in Chrom, aber nicht in Safari.
— Moulde


7
(keyup.enter)="methodname()"

Dies sollte funktionieren und bereits in vielen Antworten erwähnt, sollte jedoch auf dem Formular-Tag und nicht auf der Schaltfläche vorhanden sein.


4

Hoffentlich kann dies jemandem helfen: Aus irgendeinem Grund konnte ich aus Zeitmangel nicht nachverfolgen, wenn Sie ein Formular wie das folgende haben:

<form (ngSubmit)="doSubmit($event)">
  <button (click)="clearForm()">Clear</button>
  <button type="submit">Submit</button>
</form>

Wenn Sie die EnterTaste drücken, wird die clearFormFunktion aufgerufen, obwohl das erwartete Verhalten darin bestand, die doSubmitFunktion aufzurufen . Das Ändern der ClearSchaltfläche in ein <a>Tag hat das Problem für mich gelöst. Ich würde immer noch gerne wissen, ob das erwartet wird oder nicht. Scheint mir verwirrend


8
Um dies zu vermeiden, haben Sie type = "button" für Clear button angegeben
— radio_head

1

Wenn Sie beide einschließen möchten - akzeptieren Sie bei der Eingabe und akzeptieren Sie beim Klicken, dann tun Sie -

 <div class="form-group">
    <input class="form-control"   type="text" 
    name="search" placeholder="Enter Search Text"
              [(ngModel)]="filterdata"  
           (keyup.enter)="searchByText(filterdata)">
  <button type="submit"  
          (click)="searchByText(filterdata)" >

  </div>

1

Wenn Sie beide einfacher als das, was ich hier gesehen habe, einfügen möchten , können Sie dies einfach tun, indem Sie Ihre Schaltfläche in das Formular einfügen.

Beispiel mit einer Funktion, die eine Nachricht sendet:

                <form>
                    <mat-form-field> <!-- In my case I'm using material design -->
                        <input matInput #message maxlength="256" placeholder="Message">
                    </mat-form-field>
                    <button (click)="addMessage(message.value)">Send message
                    </button>
                </form>

Sie können wählen, ob Sie auf die Schaltfläche klicken oder die Eingabetaste drücken möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.