angular2 ส่งแบบฟอร์มโดยกด Enter โดยไม่มีปุ่มส่ง


103

เป็นไปได้ไหมที่จะส่งแบบฟอร์มที่ไม่มีปุ่มส่ง (โดยการกด Enter) ตัวอย่าง:

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

คำตอบ:


79

บางทีคุณอาจเพิ่มkeypressหรือkeydownลงในช่องป้อนข้อมูลและกำหนดเหตุการณ์ให้กับฟังก์ชันที่จะทำการส่งเมื่อคลิกเข้า

เทมเพลตของคุณจะมีลักษณะเช่นนี้

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

และคุณทำงานภายในคลาสของคุณจะมีลักษณะเช่นนี้

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

213

คุณยังสามารถเพิ่ม (keyup.enter)="xxxx()"


วิธีนี้ใช้งานได้ดีหากคุณมีฟังก์ชันเก่า ๆ ที่คุณต้องการเรียกใช้แทนตัวจัดการการส่ง
Scott

3
แนวทางนี้ถูกกล่าวถึงในเอกสารเชิงมุม angular.io/docs/ts/latest/guide/…
trungk18

นี่เป็นวิธีเดียวที่ใช้ได้ในสถานการณ์ของฉันขอบคุณ!
switch87

5
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ความสง่างามในแบบเดียวกับที่ Angular สามารถบรรลุได้ ยอดเยี่ยม.
Scott Byers

การกล่าวถึงใหม่ในเอกสาร Angular: angular.io/guide/user-input#key-event-filtering-with-keyenter
Rafael Neto

85

แก้ไข:

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

ในการใช้วิธีนี้คุณต้องมีปุ่มส่งแม้ว่าจะไม่ปรากฏ "ขอบคุณสำหรับคำตอบของ Toolkit "

คำตอบเก่า:

ใช่ตามที่คุณเขียนไว้ทุกประการยกเว้นชื่อเหตุการณ์(submit)แทนที่จะเป็น(ngSubmit):

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


2
คุณช่วยจัดหาคนขับรถได้ไหม เพราะมันใช้ไม่ได้
Toolkit

ใช้ "visibility: hidden;" แทน. "display: none;" ทำงานในโครเมี่ยม แต่ไม่ใช่ในซาฟารี
Moulde

ควรใช้สิ่งนี้ยกเว้นว่าไม่ควรซ่อนปุ่มส่ง แต่จะมองเห็นได้เนื่องจากบางคนจะมองหาปุ่มนั้นและจะไม่ต้องกด Enter
Impulse The Fox

31

ฉันชอบ(keydown.enter)="mySubmit()"เพราะจะไม่มีการเพิ่มตัวแบ่งบรรทัดหากเคอร์เซอร์อยู่ที่ไหนสักแห่งภายใน a <textarea>แต่ไม่อยู่ที่จุดสิ้นสุด


1
นี่ควรเป็นวิธีแก้ปัญหาที่ได้รับการยอมรับ - สะอาดกว่ามาก
rhysclay

30

วิธีนี้ง่ายมาก ...

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

</form>

2
ขอบคุณมันง่ายกว่าเมื่อฉันคาดหวัง แก้ไขดังนี้: <input type = "text" class = "form-control" [(ngModel)] = "object.LanguageTableData" (เบลอ) = "mymethod ()" (keyup.enter) = "mymethod ()" / >
Loutocký

1
วิธีนี้ง่ายกว่ามากแทนที่จะส่งฟังก์ชันด้วย $ event ขอบคุณ!
Helen

1
ดีกว่ามาก. ไม่มีปุ่มหรือ js ที่ซ่อนอยู่ ทางเชิงมุมบริสุทธิ์
RenanSS

ต้องทำดังนี้: <form # f = "ngForm" (keyup.enter) = "appendSigBlock (f.value)"> โดยใช้ Angular 9 แต่ใช้งานได้ดี
จอร์แดน

10

ใช้ keydown.enter แทน keyup.enter เสมอเพื่อหลีกเลี่ยงการล้าหลัง

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

และฟังก์ชั่นภายใน component.ts

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


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

สิ่งนี้ควรใช้งานได้และได้กล่าวไว้แล้วในคำตอบมากมายอย่างไรก็ตามควรมีอยู่ในแท็กแบบฟอร์มไม่ใช่บนปุ่ม


7

การเพิ่มปุ่มส่งที่มองไม่เห็นจะเป็นเคล็ดลับ

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


ใช้ "visibility: hidden;" แทน. ข้างต้นใช้งานได้ในโครเมี่ยม แต่ไม่ใช่ในซาฟารี
Moulde


4

หวังว่าสิ่งนี้จะช่วยใครบางคนได้: ด้วยเหตุผลบางอย่างฉันไม่สามารถติดตามได้เนื่องจากไม่มีเวลาหากคุณมีรูปแบบเช่น:

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

เมื่อคุณกดEnterปุ่มclearFormฟังก์ชันจะถูกเรียกแม้ว่าพฤติกรรมที่คาดหวังคือการเรียกใช้doSubmitฟังก์ชัน การเปลี่ยนClearปุ่มเป็น<a>แท็กช่วยแก้ปัญหาให้ฉันได้ ฉันยังคงต้องการทราบว่าเป็นไปตามที่คาดหวังหรือไม่ ดูเหมือนฉันจะสับสน


8
ตามลำดับเพื่อหลีกเลี่ยงสิ่งนั้นคุณได้ระบุ type = "button" สำหรับปุ่ม Clear
radio_head

3

หากคุณต้องการรวมทั้งที่เรียบง่ายกว่าที่ฉันเห็นที่นี่คุณสามารถทำได้เพียงแค่ใส่ปุ่มของคุณไว้ในแบบฟอร์ม

ตัวอย่างที่มีฟังก์ชันส่งข้อความ:

                <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>

คุณสามารถเลือกระหว่างการคลิกที่ปุ่มหรือกดปุ่ม Enter


ต้องใช้สิ่งนี้ในคำสั่งผสมกับคำตอบ @Clayton KN Passos และใช้งานได้ดีมาก!
จอร์แดน

1

หากคุณต้องการรวมทั้งสองอย่าง - ยอมรับเมื่อป้อนและยอมรับเมื่อคลิกแล้วทำ -

 <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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.