コアポイント
ng-required
やng-pattern
など)を使用して、クライアントの入力検証をすばやく確立します。 FormController
を使用してフォームステータスと検証を管理し、ユーザーにインスタントフィードバックを提供し、ユーザーエクスペリエンスを向上させます。 ng-submit
これは、HTMLソースコードで複数の
タグを使用し、各フォームインスタンスの検証モデルを維持する必要があるため、挑戦的であることがわかります。ソリューションを見つける前に、サブフォームを表示するために<form></form>
を使用するなど、多くの方法を試しました。最後に、各製品タイプ(各ディレクティブにはそのビューにngRepeat
があります)のディレクティブを作成し、ディレクティブを親コントローラーにバインドします。これにより、Angularの親子のフォーム継承を活用して、すべての子フォームが有効である場合にのみ、親フォームが有効であることを確認できます。このチュートリアルでは、シンプルな製品レビュー画面を作成します(現在のアプリケーションの主要なコンポーネントを強調表示します)。 2つの製品があり、それぞれに独自の指示があり、各製品には独自の検証ルールがあります。単純なチェックアウトボタンがあり、両方のフォームが有効であることを確認します。 <form></form>
コマンドについて
ディレクティブは、AngularJSのHTMLコンパイラ()を介して実行され、DOMに接続されているHTMLコードの一部です。コンパイラは、DOMを通過し、他の登録ディレクティブを使用してオブジェクトに変換できるコンポーネントを見つける責任があります。ディレクティブは孤立した範囲内で機能し、独自の見解を維持します。これらは、アプリケーション全体で共有できる再利用可能なコンポーネントを促進する強力なツールです。簡単なレビューについては、この記事またはAngularJSドキュメントをご覧ください。
ディレクティブは、基本的な問題を2つの方法で解決します。1つ目は、各インスタンスに隔離された範囲で、[angular ngForm属性を受け入れてname
をインスタンス化し、フォームオブジェクトを返すことができます。 FormController
FormController
について
コンパイラがDOM内の任意のフォームオブジェクトを認識すると、ディレクティブを使用してngForm
オブジェクトをインスタンス化します。このコントローラーは、すべての入力、選択、およびテキストエリア要素をスキャンし、対応するコントロールを作成します。このコントロールでは、モデルプロパティが双方向データバインディングを設定する必要があり、さまざまな事前に構築された検証方法を介してインスタントユーザーフィードバックを可能にします。消費者にインスタントフィードバックを提供し、HTTPリクエストを行う前にどの情報が有効かを知ることができます。 FormController
事前に構築された検証方法
Angularパッケージ14標準検証方法。これらには、、min
、max
、およびその他のバリデーターが含まれます。それらは、ほぼすべてのHTML5入力タイプを理解して操作するように構築されており、クロスブラウザー互換性があります。 required
<input type="text" ng-model="size" ng-required="true" novalidate> <span ng-show="myForm.size.$error.required"> Size: The value is required! </span>
ディレクティブバリデーターを使用する方法を示しています。この検証により、フィールドが有効と見なされる前にフィールドが埋められることが保証されます。データは確認されず、ユーザーが何かを入力するだけです。 ngRequired
属性を持つことは、提出時にブラウザが確認しないことを意味します。 novalidate
Proのヒント:角度形式に属性を設定しないでください。これにより、Angularがフォームが往復的に提出されないようにしようとすることができなくなります。
action
カスタム検証方法
Angularは、カスタム検証ルールの作成を支援する広範なAPIを提供します。このAPIを使用すると、標準検証でカバーされていない複雑な入力の独自の検証ルールを作成および拡張できます。私のチームは、サーバーが使用する複雑な正規表現パターンを実行するために、いくつかのカスタム検証方法に依存しています。複雑な正規表現マッチャーを実行する機能がなければ、誤ったデータをバックエンドサーバーに送信する場合があります。これにより、ユーザーにエラーが表示され、ユーザーエクスペリエンスが不良になります。カスタムバリエーターはディレクティブ構文を使用し、注入する必要があります。 AngularJSドキュメントを参照することにより、詳細については、詳細をご覧ください。 ngModel
コントローラーを作成します
今、アプリケーションを開始できます。コントローラーコードの概要はこちらをご覧ください。コントローラーは物事の中心にあります。それはわずかな責任しか持っていません - そのビューには
という名前のフォーム要素があり、属性が1つしかなく、その方法にはparentForm
、registerFormScope
、validateChildForm
が含まれます。 checkout
コントローラープロパティ
コントローラーにプロパティが必要です:<input type="text" ng-model="size" ng-required="true" novalidate> <span ng-show="myForm.size.$error.required"> Size: The value is required! </span>
このプロパティは、フォームの全体的な妥当性のブール状態を維持するために使用されます。このプロパティを使用して、チェックアウトボタンをクリックした後にステータスを無効にします。
メソッド:RegisterFormScope <
が呼び出された場合、a$scope.formsValid = false;
に追加します。 registerFormScope
FormController
FormController
メソッド:validAteChildform <
このチュートリアルの目的のために、バックエンドコンポーネントを省略したことに注意してください。代わりに、ユーザーが入力した金額が特定の範囲内にあるかどうかに基づいて、約束を拒否または解析することを拒否または解析します(製品Aは10〜50、製品Bは25-500です)。
メソッド:チェックアウト
$scope.registerFormScope = function (form, id) { $scope.parentForm['childForm'+id] = form; };
「チェックアウト」をクリックして、ユーザーが編集を完了し、チェックアウトしたいことを示します。この実用的なアイテムでは、モデルデータをサーバーに送信する前に、指令にロードされたすべてのフォームが検証されることを確認する必要があります。この記事の範囲には、データをサーバーに送信する方法は含まれていません。すべてのクライアント間通信に$q
サービスを使用することを検討することをお勧めします。
この方法はAngularの能力を使用し、子のフォームは親の形を無効にする可能性があります。親の形式は、子供の形との関係を明確に説明するためにに指名されています。子フォームが
メソッドを使用すると、親フォームに自動的に上昇して、そこに有効性を設定します。のすべてのフォームは有効でなければならず、その内部$http
属性は真でなければなりません。
$scope.validateChildForm = function (form, data, product) { // 重置表单,使其不再有效 $scope.formsValid = false; var deferred = $q.defer(); // 验证表单和数据的逻辑 // 必须在promise上返回resolve()或reject()。 $timeout(function () { if (angular.isUndefined(data.amount)) { return deferred.reject(['amount']); } if ((data.amount < product.minAmount) || (data.amount > product.maxAmount)) { return deferred.reject(['amount']); } deferred.resolve(); }); return deferred.promise; }
ディレクティブを作成しますparentForm
$setValidity
parentForm
私たちの命令は、完全な相互運用性とスケーラビリティを可能にする共通のインターフェイスに従う必要があります。私たちの指令の名前は、それらに含まれる製品によって異なります。 $valid
分離命令の範囲範囲<
インスタンス化された各指令は、指令にローカライズされ、外部プロパティが既知の孤立した範囲を取得します。ただし、Angularjsは、親スコープメソッドとプロパティを使用するディレクティブを作成できます。外部プロパティをローカルスコープに渡す場合、双方向データバインディングを設定することを示すことができます。アプリケーションには、外部の双方向データの結合方法とプロパティが必要です。
メソッド:RegisterFormScope
ディレクティブローカルスコープの最初のプロパティは、ローカルスコープをコントローラーに登録する方法です。この命令では、ローカルオブジェクトをメインコントローラーに渡すためのパイプラインが必要です。
これは、命令ビューで使用される集中モデルデータです。この情報は、FormController
で発生する更新がメインコントローラーに伝播するように、双方向のデータバインディングになります。
このメソッドは、コントローラーで定義されている方法と同じです。この方法は、ユーザーが命令ビューで情報を更新するときに呼び出されます。
このオブジェクトには、購入されている製品に関する情報が含まれています。私たちのデモンストレーションでは、少数のプロパティしかない比較的小さなオブジェクトを使用しています。私のチームの実際のアプリケーションには、アプリケーションで決定を下すための多くの情報があります。検証されているコンテンツのコンテキストを提供するために、validateChildForm
に渡されます。
命令リンク
私たちの指令は、postLink
関数を使用し、スコープオブジェクトを渡します。さらに、postLink
関数は他のいくつかのパラメーターも受け入れます。それらは次のとおりです:
scope
- 各ディレクティブインスタンスに作成された分離スコープにアクセスするために使用されます。 iElement
- 要素アイテムにアクセスするために使用されます。割り当てられている要素内のpostLink
関数から要素を更新および変更することは安全です。 iAttrs
- インスタンス化指令の同じタグのプロパティにアクセスするために使用されます。 controller
- 外部コントローラーの依存関係が存在する場合、リンク関数で使用できます。これらは、ディレクティブオブジェクトのrequire
属性に対応する必要があります。 transcludeFn
- この関数は、命令オブジェクトの$transclude
パラメーターにリストされている関数と同じです。 link
責任があります。
<input type="text" ng-model="size" ng-required="true" novalidate> <span ng-show="myForm.size.$error.required"> Size: The value is required! </span>
$scope.formsValid = false;
ラッピングメソッドregisterFormScope
in$timeout
は、実行スタックが終了するまで実行を遅らせます。これにより、コンパイラは、コントローラーと命令の間に必要なすべてのリンクを完了するのに十分な時間を提供します。 scope.form.fields
は配列であり、FormController
で見つかったプロパティの名前であり、サーバー側の検証エラーを設定するために非常に重要です。 registerFormScope
の目的は、FormController
を親コントローラーに送信し、新しく作成されたフォームをparentForm
の子フォームに設定できるようにすることです。
$scope.registerFormScope = function (form, id) { $scope.parentForm['childForm'+id] = form; };
メソッドが呼び出されます。この方法では、コントローラーのsaveForm
メソッドを順番に呼び出して、validateChildForm
、FormController
、scope.giftData
に渡します。コントローラーは、他の検証ルールに従って解析または拒否される約束を返します。 scope.product
約束が拒否されると、コントローラーは無効なフィールドを返します。これは、フォームを無効にし(parentForm
)、他のフィールドレベルエラーを設定するために使用されます。デモでは、amount
フィールドでの単純なポスト検証を使用しますが、失敗の原因は返されません。 validateChildForm
からの拒否は、アプリケーションが必要とするのと同じくらい複雑または単純です。
Promiseが正常に戻った場合、コマンドはフォームにフィールドの有効性を設定する必要があります。コードは、以前に特定されたサーバーエラーもクリアする必要があります。これにより、指令がユーザーに誤ってエラーを提供しないことが保証されます。すべてのサブフォームが有効である場合、$setValidity
のすべてのフィールドをコントローラー内のparentForm
にリンクして有効性を設定します。
私たちの見解を設定します< ビューはそれほど複雑ではありません。デモでは、製品を次のフィールドに簡素化しました。名前と量です。次のステップでは、このアプリケーションを完了するために必要なビューを調査します。
ビューコードの概要(製品A)およびここ(製品B)を見つけることができます。
ルートビューこのビューは、製品指令からロードされたすべての子供フォームをラップするために使用される親フォームをセットアップするため、重要です。
<input type="text" ng-model="size" ng-required="true" novalidate> <span ng-show="myForm.size.$error.required"> Size: The value is required! </span>
を使用すると、DOMが未使用のng-repeat
で誤って満たされないようにします。 ng-if
FormController
注:デモレイアウトに関する上記のビューは、一部の場所で切り捨てられており、この記事とは何の関係もありません。
$scope.formsValid = false;
上記の
は、AngularのamountInput
ビューの下部に、ユーザーが[保存]ボタンをクリックすると、ユーザーにフィードバックを提供するためにすべてのエラーを表示します。これにより、サブフォームにngPattern
プロパティが設定されます。 ngDisabled
概要$submitted
すべてのピースをまとめると、次のことがわかります。 GitHub上のすべてのコードも見つけることができます。
結論
私のチームは、最新のアプリを構築するときに多くのことを学びました。父と息子のフォーム関係を理解することで、コメント画面を簡素化することができます。ディレクティブを使用すると、任意のコンテキストで使用できるフォームを開発でき、適切な再利用可能なコードを宣伝できます。また、この指令により、コードをユニットテストして、フォームが予想どおりに機能するようにすることもできます。当社のアプリケーションは生産されており、100,000を超える注文に貢献しています。
この記事を読んで楽しんでいただければ幸いです。ご質問やコメントがある場合は、以下のコメントで聞いてみたいです。 Angularjsのフォームベースの指示
のFAQ
angularjsでカスタムフォームベースのディレクティブを作成する方法は?
、.directive
、restrict
などを含む複数のプロパティを定義できます。 template
オプションは、htmlでディレクティブの呼び出し方を指定するために使用されます。 scope
link
angularjsディレクティブを使用してフォーム入力を検証する方法は? restrict
、ng-required
などを含むフォーム検証のための組み込みの指示を提供します。これらの命令は、フォーム入力に検証を追加し、フォームが送信される前にユーザー入力が特定の基準を満たすようにします。より複雑な検証要件のために、カスタム検証指令を作成することもできます。 ng-pattern
ng-minlength
angularjsのformcontrollerの目的は何ですか? ng-maxlength
Angularjsの
angularjsでng-submitディレクティブを使用する方法は? FormController
AngularJSの
angularjsのフォームとng-formの違いは何ですか? ng-submit
ng-submit
in
指令はネスティングをサポートしていません。 form
ng-form
angularjsのフォームフィールドの妥当性を設定する方法は? ng-form
form
ng-model
ディレクティブは、入力、選択、テキスト領域、または範囲上のプロパティへのカスタムフォームコントロールにバインドします。モデルとビューの間に双方向のデータ結合を提供します。これは、入力フィールドの変更がモデルを自動的に更新し、逆も同様であることを意味します。
指令により、ユーザーが入力を変更したときにカスタム動作を指定できます。この指令は、フォームが提出されるのを待つ代わりに、ユーザーが入力または選択の作成を終了した直後に何かを実行したい場合に役立ちます。 ng-change
関数では、ngModel
またはlink
パイプラインを使用して、カスタム検証ロジックを追加できます。 ngModelController
以上がAngularJSでフォームベースのディレクティブを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。