ปิดใช้งานปุ่มส่งเมื่อแบบฟอร์มไม่ถูกต้องกับ AngularJS


174

ฉันมีแบบฟอร์มของฉันเช่นนี้:

<form name="myForm">
    <input name="myText" type="text" ng-model="mytext" required />
    <button disabled="{{ myForm.$invalid }}">Save</button>
</form>

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


คำตอบ:


339

คุณต้องใช้ชื่อของแบบฟอร์มของคุณรวมถึง ng-disabled: นี่คือตัวอย่างของ Plunker

<form name="myForm">
    <input name="myText" type="text" ng-model="mytext" required />
    <button ng-disabled="myForm.$invalid">Save</button>
</form>

ขออภัยฉันใช้ตอนนี้ กระนั้นก็ยังคงถูกปิดใช้งานแม้ว่ากล่องข้อความมีข้อความ
ali

1
+1 โดยบังเอิญฉันเพิ่งอ่านโพสต์ที่ยอดเยี่ยมนี้ของคุณ: benlesh.com/2012/11/angular-js-form-validation.html
Ben

ถ้าฉันไม่มีแบบฟอร์มล่ะ ฉันสามารถทำสิ่งนั้นกับองค์ประกอบ div ได้หรือไม่?
VsMaX

1
@MichaelCwienczek เทคนิคคุณสามารถเพิ่ม ng รูปแบบไปยังแท็ก div <div ng-form="myForm"> ... stuff here .. </div>นี้: แม้ว่าหากคุณกำลังส่งค่าจากอินพุตเมื่อกดปุ่มฉันขอแนะนำให้ใช้<form/>แท็กหากไม่มีเหตุผลอื่นนอกจากจะอนุญาตให้ผู้ใช้กด [ENTER] และส่งแบบฟอร์ม แต่ก็มีแนวโน้มว่าจะเป็นการปฏิบัติที่ดีกว่าเพราะสิ่งต่าง ๆ เช่นความกังวลเรื่องการเข้าถึง
Ben Lesh

2
@BenLesh จะเกิดอะไรขึ้นถ้าปุ่มส่งไม่อยู่ในแบบฟอร์มของฉันและยังคงต้องปิดการใช้งานถ้าแบบฟอร์มไม่ถูกต้อง
ตัวช่วยสร้างสีเขียว

33

เพื่อเพิ่มคำตอบนี้ ฉันเพิ่งพบว่ามันจะพังถ้าคุณใช้ยัติภังค์ในชื่อแบบฟอร์มของคุณ (Angular 1.3):

ดังนั้นสิ่งนี้จะไม่ทำงาน:

<form name="my-form">
    <input name="myText" type="text" ng-model="mytext" required />
    <button ng-disabled="my-form.$invalid">Save</button>
</form>

3
ใช่ชื่อแบบฟอร์มควรเป็นกรณีอูฐสำหรับการตรวจสอบความถูกต้องของแบบฟอร์ม AngularJS
dubilla

7
ตามกฎของหัวแม่มือ js เช่นนิพจน์ทั้งหมดจะรับรู้วัตถุในรูปแบบ camelcase ในขณะที่ขีดกลางสำหรับ html เช่นไวยากรณ์
ecoologic

ดังนั้นจะเกิดอะไรขึ้นถ้าแบบฟอร์มเป็นสมาชิกของ formset และดังนั้นจึงจำเป็นต้องมีชื่อที่มียัติภังค์อยู่ในนั้น (เช่น "my_formset_name-0")
trubliphone

2
ในตัวอย่างด้านบนฉันเชื่อว่าmyForm.$invalidควรใช้งานได้ดังนั้นในกรณีของคุณฉันคิดว่าmy_formset_name0.$invalidควรใช้งานได้
wvdz

29

การตอบสนองที่เลือกนั้นถูกต้อง แต่บางคนอย่างฉันอาจมีปัญหากับการตรวจสอบความถูกต้องแบบ async กับการส่งคำขอไปยังเซิร์ฟเวอร์ - ปุ่ม - จะไม่ถูกปิดใช้งานในระหว่างการประมวลผลคำขอที่กำหนดดังนั้นปุ่มจะกะพริบซึ่งดูแปลกสำหรับผู้ใช้

หากต้องการเป็นโมฆะคุณต้องจัดการกับ $ รอสถานะของแบบฟอร์ม:

<form name="myForm">
  <input name="myText" type="text" ng-model="mytext" required />
  <button ng-disabled="myForm.$invalid || myForm.$pending">Save</button>
</form>

ขอบคุณมากสำหรับโซลูชันการตรวจสอบความถูกต้องของ async!
Martin Brandl

คุณควรใช้!myForm.$validที่จัดการปัญหาที่รอดำเนินการ async เช่นกัน itnext.io/valid-and-invalid-in-angular-forms-61cfa3f2a0cd
SavageCore

6

หากคุณใช้แบบฟอร์มตอบโต้คุณสามารถใช้สิ่งนี้:

<button [disabled]="!contactForm.valid" type="submit" class="btn btn-lg btn primary" (click)="printSomething()">Submit</button>

2
แม้ว่านี่จะเป็นคำแนะนำที่ถูกต้องสำหรับ "Angular" แต่คำตอบนี้ไม่ถูกต้องสำหรับ "AngularJS" กล่าวคือ(click)และ[disabled]ไม่ถูกต้องรหัส AngularJS และไม่เป็นแบบฟอร์มปฏิกิริยาส่วนหนึ่งของกรอบ AngularJS "Angular เป็นชื่อของ Angular ของวันนี้และวันพรุ่งนี้ AngularJS เป็นชื่อของ Angular ทั้งหมด v1.x" angular.io/guide/ajs-quick-reference
dapperdan1985

1

เราสามารถสร้างคำสั่งง่าย ๆ และปิดการใช้งานปุ่มจนกว่าฟิลด์บังคับทั้งหมด

angular.module('sampleapp').directive('disableBtn',
function() {
 return {
  restrict : 'A',
  link : function(scope, element, attrs) {
   var $el = $(element);
   var submitBtn = $el.find('button[type="submit"]');
   var _name = attrs.name;
   scope.$watch(_name + '.$valid', function(val) {
    if (val) {
     submitBtn.removeAttr('disabled');
    } else {
     submitBtn.attr('disabled', 'disabled');
    }
   });
  }
 };
}
);

สำหรับข้อมูลเพิ่มเติมคลิกที่นี่


วิธีการแก้ปัญหาของคุณใช้ได้กับฉันด้วยการปรับแต่งเล็กน้อย ขอบคุณ
Tatipaka

ทำไมคุณต้องทำเช่นนี้เมื่อมีคำสั่งพื้นฐานng-disabledในเชิงมุม 1.x และ[disabled]เชิงมุม 2 | 4.x ที่ผ่านการทดสอบดีกว่านี้มาก? ประการที่สองเหตุใดจึงมีคำสั่งที่กำหนดขอบเขตให้กับฟอร์มเพื่อปิดใช้งานปุ่มซ้อนกัน IMO เป็นวิธีแก้ปัญหาที่คิดไม่ดี
David Barker

ข้างต้นเป็นคำสั่งตัวอย่างต้นฉบับมีหลายสถานการณ์เช่นกล่องกาเครื่องหมายซ้อนกันเป็นต้นและฉันไม่ต้องการยุ่งรหัส html ของฉันโดยการเพิ่มในทุกรูปแบบแทนคำสั่งนี้จะดูแลทุกสิ่ง
Prashobh

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