Vô hiệu hóa nút gửi khi biểu mẫu không hợp lệ với AngularJS


174

Tôi có hình thức của tôi như thế này:

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

Như bạn có thể thấy, nút bị vô hiệu hóa nếu đầu vào trống nhưng nó không thay đổi trở lại thành bật khi nó chứa văn bản. Làm thế nào tôi có thể làm cho nó hoạt động?


Câu trả lời:


339

Bạn cần sử dụng tên của biểu mẫu của mình, cũng như ng-vô hiệu hóa: Đây là bản demo trên Plunker

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

Xin lỗi, tôi sử dụng nó bây giờ. Tuy nhiên, nó vẫn bị vô hiệu hóa ngay cả khi hộp văn bản chứa văn bản
ali

1
+1 Thật trùng hợp, tôi vừa đọc bài đăng tuyệt vời này của bạn: ben Meat.com/2012/11/angular-js-form-validation.html
Ben

Nếu tôi không có mẫu đơn thì sao? Tôi có thể làm điều đó trên phần tử div không?
VsMaX

1
@MichaelCwienczek về mặt kỹ thuật, bạn có thể thêm ng-form vào thẻ div : <div ng-form="myForm"> ... stuff here .. </div>. Mặc dù, nếu bạn đang gửi một giá trị từ đầu vào, trên nút nhấn, tôi đánh giá cao đề nghị sử dụng một <form/>thẻ, nếu không có lý do khác hơn là nó cho phép người dùng hit [ENTER] và gửi biểu mẫu. Nhưng nó cũng có khả năng cấu thành thực tiễn tốt hơn vì những thứ như mối quan tâm tiếp cận.
Ben Lesh

2
@BenLesh, nếu nút gửi không nằm trong biểu mẫu của tôi và tôi vẫn phải tắt nó nếu biểu mẫu không hợp lệ.
Phù thủy xanh

33

Để thêm vào câu trả lời này. Tôi chỉ phát hiện ra rằng nó cũng sẽ bị hỏng nếu bạn sử dụng dấu gạch nối trong tên biểu mẫu của bạn (Angular 1.3):

Vì vậy, điều này sẽ không hoạt động:

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

3
Có, tên biểu mẫu phải nằm trong trường hợp lạc đà cho bất kỳ xác nhận mẫu AngularJS nào.
dubilla

7
như một quy tắc chung, tất cả các biểu thức như js sẽ nhận ra các đối tượng ở dạng camelcase, trong khi dấu gạch ngang dành cho cú pháp như html
ecoologic 15/12/14

Vì vậy, điều gì xảy ra nếu biểu mẫu là thành viên của một bộ định dạng và do đó bắt buộc phải có tên w / dấu gạch nối trong đó (như "my_formset_name-0")?
trubliphone 7/10/2015

2
Trong ví dụ trên, tôi tin rằng myForm.$invalidvẫn nên hoạt động, vì vậy trong trường hợp của bạn, tôi sẽ nghĩ my_formset_name0.$invalidnên làm việc.
wvdz

29

Phản hồi được chọn là chính xác, nhưng ai đó như tôi, có thể gặp sự cố với xác thực không đồng bộ khi gửi yêu cầu đến phía máy chủ - nút sẽ không bị vô hiệu hóa trong quá trình xử lý yêu cầu đã cho, do đó nút sẽ nhấp nháy, trông khá lạ đối với người dùng.

Để vô hiệu hóa điều này, bạn chỉ cần xử lý trạng thái $ chờ xử lý của biểu mẫu:

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

Cảm ơn bạn rất nhiều vì giải pháp xác thực async!
Martin Brandl

Bạn chỉ nên sử dụng !myForm.$validxử lý các vấn đề đang chờ xử lý không đồng bộ. itnext.io/valid-and-invalid-in-angular-forms-61cfa3f2a0cd
SavageCore

6

Nếu bạn đang sử dụng Biểu mẫu phản ứng, bạn có thể sử dụng:

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

2
Mặc dù đây là lời khuyên hợp lệ cho "Angular", câu trả lời này không hợp lệ cho "AngularJS". Cụ thể, (click)[disabled]không phải là mã AngularJS hợp lệ, cũng không phải là dạng phản ứng là một phần của khung AngularJS. "Angular là tên của Angular của ngày hôm nay và ngày mai. AngularJS là tên của tất cả các phiên bản v1.x của Angular" angular.io/guide/ajs-quick-reference
dapperdan1985 18/10/18

1

Chúng ta có thể tạo một lệnh đơn giản và vô hiệu hóa nút cho đến khi tất cả các trường bắt buộc được điền.

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');
    }
   });
  }
 };
}
);

Để biết thêm thông tin bấm vào đây


Phương pháp giải pháp của bạn làm việc cho tôi với ít điều chỉnh. Cảm ơn bạn
Tatipaka

Tại sao bạn sẽ làm điều này khi có các chỉ thị gốc ng-disabledở góc 1.x và [disabled]ở góc 2 | 4.x được thử nghiệm tốt hơn nhiều so với điều này?. Thứ hai, tại sao có một lệnh được đặt trong một biểu mẫu để vô hiệu hóa nút lồng nhau, nó siêu cụ thể. Một suy nghĩ không giải pháp IMO.
David Barker

Trên đây là một chỉ thị mẫu, bản gốc có nhiều kịch bản như hộp kiểm lồng nhau, v.v. và tôi không muốn làm rối mã html của mình bằng cách thêm vào mọi hình thức, thay vào đó, lệnh này sẽ chăm sóc tất cả mọi thứ.
Prashobh

1

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

Nếu bạn muốn nghiêm khắc hơn một chút

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.