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.