ng-submit trong AngularJS: Xử lý việc gửi biểu mẫu với ví dụ

⚡ Tóm tắt thông minh

Trong AngularJS, ng-submit liên kết một hàm của controller với sự kiện submit của trình duyệt khi nhập biểu mẫu, do đó các giá trị đã nhập được xử lý bên trong controller và trang sẽ không bao giờ tải lại thông qua phương thức POST mặc định.

  • 🔘 Vai trò chỉ đạo: ng-submit liên kết một biểu thức AngularJS với sự kiện submit của một phần tử trong biểu mẫu.
  • ☑️ Không cần tải lại trang: Phương thức POST mặc định của trình duyệt sẽ bị vô hiệu hóa trừ khi biểu mẫu có thuộc tính action.
  • Ví dụ thực tế: Việc sử dụng hộp văn bản kết hợp với hàm Display() sẽ đẩy từng chủ đề vào mảng AllTopic để sử dụng với ng-repeat.
  • 🧪 Cổng xác thực: Việc kết hợp biến môi trường `$valid` với `novalidate` và `ng-disabled` sẽ ngăn chặn việc gửi dữ liệu không đầy đủ.
  • 🛠️ Lỗi thường gặp: Việc liên kết ng-click với nút gửi bên cạnh ng-submit gây ra hiện tượng gửi dữ liệu hai lần.
  • 📊 Ghi chú phiên bản: Việc hỗ trợ AngularJS đã kết thúc vào tháng 1 năm 2022; các ứng dụng Angular hiện đại gửi dữ liệu thông qua (ngSubmit).

Chỉ thị `ng-submit` trong AngularJS liên kết sự kiện gửi biểu mẫu với một hàm của bộ điều khiển.

Chỉ thị ng-submit của AngularJS

ng-gửi chỉ thị trong AngularJS được sử dụng để liên kết ứng dụng với sự kiện gửi của trình duyệt. Vì vậy trong trường hợp AngularJS trong sự kiện gửi, bạn có thể thực hiện một số xử lý trong chính bộ điều khiển và sau đó hiển thị thông tin đã xử lý cho người dùng.

Ghi chú phiên bản: AngularJS 1.x đã ngừng hỗ trợ dài hạn vào ngày 31 tháng 12 năm 2021, và nhóm phát triển framework xác nhận điều này. Việc hỗ trợ AngularJS đã chính thức kết thúc. Vào tháng 1 năm 2022, vì vậy sẽ không có bản phát hành hoặc bản vá bảo mật nào tiếp theo. Mọi bước và khối mã bên dưới đều được giữ nguyên chính xác như đã viết, như một tài liệu tham khảo lịch sử. Công việc mới thuộc về Angular hiện đại, thể hiện cùng một ý tưởng như vậy. (ngSubmit) được liên kết với FormGroup.

Cách gửi biểu mẫu trong AngularJS bằng ng-submit

Quá trình gửi thông tin trên một trang web thường được xử lý bởi sự kiện gửi trên trình duyệt web. Sự kiện này thường được sử dụng để gửi thông tin mà người dùng có thể đã nhập trên trang web tới máy chủ để xử lý thêm như thông tin xác thực đăng nhập, dữ liệu biểu mẫu, v.v. Việc gửi thông tin có thể được thực hiện thông qua yêu cầu GET hoặc POST.

Hãy lấy một ví dụ gửi biểu mẫu Angular để xem cách gửi biểu mẫu trong AngularJS.

Trong ví dụ về gửi biểu mẫu AngularJS của chúng tôi, chúng tôi sẽ trình bày một hộp văn bản cho người dùng để họ có thể nhập chủ đề mà họ muốn tìm hiểu. Sẽ có một nút gửi trên trang, khi nhấn vào sẽ thêm chủ đề vào danh sách không có thứ tự.

Hình minh họa bên dưới tracCác thao tác diễn ra từ chủ đề được nhập vào ô văn bản, qua nút Gửi, đến mục danh sách được thêm vào bên dưới.

Biểu mẫu AngularJS với hộp văn bản chủ đề, nút Gửi và danh sách chủ đề không được sắp xếp kết quả.
Gửi biểu mẫu trong AngularJS bằng ng-submit

Ví dụ gửi biểu mẫu AngularJS

Bây giờ, chúng ta sẽ xem một ví dụ về gửi biểu mẫu AngularJS từ Bộ điều khiển bằng cách sử dụng lệnh ng-submit:

<!DOCTYPE html>
<html>
<head>

    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>

<body  ng-app="sampleApp">
<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="lib/bootstrap.js"></script>
<script src="lib/bootstrap.css"></script>
<h1> Guru99 Global Event</h1>
<div ng-controller="AngularController">

    <form ng-submit="Display()">
        &nbsp;&nbsp;&nbsp;
        Enter which topic you would like to learn
        <input type="text"  ng-app="sampleApp" ng-model="Topic"><br>

        <input type="submit" value="Submit"/>

        <ul ng-repeat="topicname in AllTopic">
            <li>{{topicname}}</li>
        </ul>
    </form>
</div>

<script>
   var sampleApp = angular.module("sampleApp",[]);

    sampleApp.controller("AngularController",function($scope) {
        $scope.AllTopic=[];
        $scope.Display = function () {
            $scope.AllTopic.push($scope.Topic);
        }
    });
</script>
</body>
</html>

Code Giải thích:

  1. Đầu tiên, chúng ta khai báo thẻ HTML của biểu mẫu, thẻ này sẽ chứa điều khiển "hộp văn bản" và "nút gửi" như trong ví dụ về sự kiện gửi biểu mẫu Angular. Sau đó, chúng ta sử dụng chỉ thị ng-submit của AngularJS để liên kết hàm "Display()" với biểu mẫu của mình. Hàm này sẽ được định nghĩa trong bộ điều khiển của chúng ta và sẽ được gọi khi biểu mẫu được gửi đi.
  2. Chúng tôi có một điều khiển văn bản trong đó người dùng sẽ nhập Chủ đề họ muốn tìm hiểu. Điều này sẽ được liên kết với một biến gọi là 'Chủ đề' sẽ được sử dụng trong bộ điều khiển của chúng tôi.
  3. Có nút gửi thông thường trong AngularJS mà người dùng sẽ nhấp vào khi họ nhập chủ đề họ muốn.
  4. Chúng tôi đã sử dụng ng-lặp lại chỉ thị hiển thị các mục danh sách của chủ đề mà người dùng nhập vào. Lệnh ng-repeat đi qua từng chủ đề trong mảng 'AllTopic' và hiển thị tên chủ đề tương ứng.
  5. Trong bộ điều khiển của chúng ta, chúng ta khai báo một biến mảng có tên là 'AllTopic'. Biến này sẽ được sử dụng để lưu trữ tất cả các chủ đề do người dùng nhập ở Bước 2.
  6. Chúng tôi đang xác định mã cho hàm Display() sẽ được gọi bất cứ khi nào người dùng nhấp vào nút Gửi. Ở đây, chúng tôi đang sử dụng hàm đẩy mảng để thêm Chủ đề được người dùng nhập thông qua biến 'Chủ đề' vào mảng 'AllTopic' của chúng tôi.

Nếu mã mẫu AngularJS được thực thi thành công, kết quả sau sẽ hiển thị khi bạn chạy mã trên trình duyệt.
Đầu ra:

Ảnh hiển thị trên trình duyệt của ví dụ AngularJS ng-submit cho thấy ô nhập liệu trống và nút Gửi.

Để xem mã hoạt động, trước tiên, hãy nhập Tên chủ đề như “Angular” như hiển thị ở trên vào hộp văn bản, sau đó nhấp vào nút Gửi.

Đây là kết quả đầu ra của AngularJS ng-submit sau khi nhấn nút Gửi, với chủ đề đã nhập được thêm vào danh sách.

  • Sau khi nhấp vào nút gửi, bạn sẽ thấy mục được nhập vào hộp văn bản được thêm vào danh sách các mục.
  • Điều này đạt được nhờ hàm Display(), hàm này được gọi khi nhấn nút gửi.
  • Hàm Display() thêm văn bản vào biến mảng có tên là 'AllTopic.' Và lệnh ng-repeat của chúng tôi đi qua từng giá trị trong biến mảng 'AllTopic' và hiển thị chúng dưới dạng các mục danh sách tương ứng.

ng-submit vs ng-click: Nên sử dụng cái nào

Cả hai Các chỉ thị AngularJS Chúng có thể gọi cùng một hàm điều khiển, nhưng lại lắng nghe các sự kiện trình duyệt khác nhau. ng-submit ngồi trên <form> Thẻ này phản ứng với sự kiện gửi, vì vậy nó cũng được kích hoạt khi người dùng nhấn Enter bên trong một trường nhập liệu. ng-click Nó nằm trên một nút bấm và chỉ phản hồi khi có cú nhấp chuột hoặc thao tác kích hoạt tương đương.

Yếu tố ng-gửi ng-click
Phần tử chủ Thẻ biểu mẫu Bất kỳ phần tử nào có thể nhấp chuột
Sự kiện đã được lắng nghe gửi, bao gồm cả phím Enter. chỉ nhấp chuột
Trình duyệt mặc định POST Bị đàn áp bởi chỉ thị Vẫn gửi dữ liệu từ nút gửi.
Truy cập vào trạng thái biểu mẫu Đọc các giá trị `$valid` và `$invalid` trên bộ điều khiển biểu mẫu. Không có ngữ cảnh hình thức riêng
Phù hợp tự nhiên Chuyển dữ liệu biểu mẫu cho bộ điều khiển. Các nút trên thanh công cụ, liên kết, trình kích hoạt cửa sổ bật lên

Khả năng hỗ trợ bàn phím thường là yếu tố quyết định. Một hình thức được kết nối với ng-click Chức năng này tự động bỏ qua phím Enter, gây khó chịu cho người dùng khi điền thông tin đăng nhập. (Lưu ý: Phần cuối "Reserve" không cần dịch) ng-click Đối với các thao tác không phải là gửi biểu mẫu, chẳng hạn như xóa nội dung trong một trường hoặc mở hộp thoại.

Vì sao ng-submit ngăn chặn việc gửi dữ liệu mặc định của trình duyệt?

Một biểu mẫu HTML thông thường phản hồi sự kiện gửi bằng cách tuần tự hóa các trường của nó và yêu cầu trình duyệt tải một trang mới, điều này sẽ loại bỏ mọi giá trị được lưu trữ trong đó. $scope. Các ng-submit Chỉ thị này ngăn chặn điều đó xảy ra: nó kêu gọi preventDefault() Đối với bạn, biểu thức sẽ chạy và trang hiện tại vẫn giữ nguyên vị trí. Không $event Không cần đối số và không cần gọi thủ công.

Việc đàn áp này có một điều kiện được ghi nhận. Theo... tham chiếu ngSubmitHành động mặc định chỉ bị ngăn chặn khi biểu mẫu không chứa bất kỳ dữ liệu nào. action, data-action or x-action thuộc tính. Thêm bất kỳ thuộc tính nào trong số đó và trình duyệt sẽ điều hướng như bình thường sau khi trình xử lý hoàn tất, đây là hành vi chính xác đối với một biểu mẫu được hiển thị trên máy chủ được cải tiến dần dần và là điều bất ngờ ở mọi nơi khác.

Vì chỉ thị này nuốt chửng đối tượng sự kiện, hãy đọc các giá trị đã gửi từ các thuộc tính đó. mô hình ng ghi chúng vào phạm vi hoặc truyền chúng một cách rõ ràng, như trong ng-submit="Display(Topic)".

Cách xác thực biểu mẫu trước khi chạy ng-submit

Ví dụ trên chấp nhận một chủ đề trống, vì không có gì kiểm tra hộp văn bản trước. AngularJS xây dựng một bộ điều khiển biểu mẫu cho mỗi biểu mẫu được đặt tên, và bộ điều khiển đó hiển thị các cờ cần thiết để kiểm soát việc gửi biểu mẫu. Thêm novalidate Vì vậy, trình duyệt sẽ tắt các "bong bóng" HTML5 của riêng nó và AngularJS. xác nhận hình thức Chiếm giữ.

  1. Hãy đưa cho biểu mẫu a nameAngularJS công bố một bộ điều khiển có tên đó trên môi trường xung quanh. điều khiển phạm vi.
  2. Thêm novalidate thêm thẻ form để việc xác thực trình duyệt gốc không gây cản trở.
  3. Đánh dấu các ô, bằng cách sử dụng required, ng-minlength, ng-maxlength or ng-pattern.
  4. Bảo vệ người điều khiển bằng $validvà truyền bộ điều khiển biểu mẫu vào để hàm có thể kiểm tra từng trường riêng lẻ.
  5. Vô hiệu hóa nút bằng ng-disabled chỉ vào $invalidĐiều này mang lại phản hồi trực quan ngay lập tức.
<form name="topicForm" ng-submit="topicForm.$valid && Display(topicForm)" novalidate>
    <input type="text" name="Topic" ng-model="Topic" required>
    <input type="submit" value="Submit" ng-disabled="topicForm.$invalid">
</form>

Hai lỗi chính là nguyên nhân gây ra hầu hết các vấn đề được báo cáo liên quan đến mẫu này:

  • Double nộp hồ sơ. Binding ng-click trên nút gửi trong khi ng-submit Hàm này chạy trình xử lý hai lần, mỗi lần một sự kiện. Tài liệu tham khảo chính thức cảnh báo không nên kết hợp hai trình xử lý, vì vậy hãy chọn một.
  • Bài nộp bất ngờ. Bất kỳ nút nào bên trong biểu mẫu mà không type="button" Kích hoạt sự kiện gửi. Đánh dấu rõ ràng các nút hủy và đặt lại, nếu không chúng cũng sẽ kích hoạt trình xử lý.

Đang canh gác $valid Đây chỉ là một tiện ích, không phải là biện pháp kiểm soát an ninh. Các giá trị vẫn cần được xác thực lại trên máy chủ trước khi được lưu trữ.

Câu Hỏi Thường Gặp

Đúng vậy. Một biểu mẫu chứa trường nhập liệu hoặc nút thuộc loại submit sẽ kích hoạt sự kiện submit khi nhấn phím Enter bên trong trường đó, vì vậy biểu thức ng-submit sẽ chạy mà không cần bất kỳ trình xử lý phím bổ sung nào.

Không. Chỉ các phần tử form mới kích hoạt sự kiện submit mà directive lắng nghe. Hãy chuyển ng-submit vào thẻ form, hoặc gắn ng-click vào phần tử mà bạn thực sự muốn phản ứng.

ng-submit không truyền tham số nào. Hãy đọc các thuộc tính phạm vi mà ng-model đã điền vào, hoặc truyền chúng một cách rõ ràng, ví dụ: ng-submit=”Display(Topic)” hoặc ng-submit=”Display(topicForm)”.

Đúng vậy. Mỗi phần tử biểu mẫu sẽ có bộ điều khiển biểu mẫu riêng, vì vậy hãy đặt tên duy nhất cho mỗi biểu mẫu và liên kết một trình xử lý riêng biệt. Việc chia sẻ một hàm giữa các biểu mẫu sẽ dẫn đến xung đột phạm vi.

Trình xử lý sẽ được kích hoạt trong cả hai trường hợp, nhưng một trường không có mô hình ng Biến `$scope` không bao giờ ghi giá trị của nó vào `$scope`, vì vậy hàm không thể đọc được nó. Hãy liên kết mọi đầu vào mà bạn dự định xử lý.

Biên dịch biểu mẫu trong một bài kiểm tra, đặt giá trị mô hình trên phạm vi, kích hoạt sự kiện gửi, sau đó xác nhận trên mảng hoặc lệnh gọi dịch vụ mà trình xử lý tạo ra. Karma và Jasmine vẫn là sự kết hợp thông thường.

Các mô hình ngôn ngữ đọc hình dạng mô hình và bản nháp cần thiết, các thuộc tính ng-pattern và ng-minlength cùng với các thông báo phù hợp, điều này làm thay đổi phần lớn AngularJS. xác nhận hình thức đưa công việc vào bước xem xét.

Trợ lý GitHub Chế độ tác vụ viết lại mẫu thành (ngSubmit) với FormGroup và tạo khung cho lớp thành phần, tuy nhiên các trình xác thực được tạo ra và các lệnh gọi bất đồng bộ vẫn cần được con người xem xét và kiểm tra.

Tóm tắt bài viết này với: