入力に対していくつかの拡張機能を構築しましたが、既存の ngModel バインディングを拡張する最良の (ほぼ間違いなく) 唯一の方法は、ディレクティブで ngModelController を使用することです。「require」プロパティを使用して、別のディレクティブのコントローラーを要求できます。ngModelControllerのドキュメントはこちら
これにより、モデル値を取得/設定したり、必要に応じて検証動作を拡張または置換したりできます。AngularJS の入力ディレクティブを組み合わせて拡張している可能性があるため、これがどのように機能するかの例として、AngularJS 内の入力ディレクティブも調べたいと思うでしょう。また、フォーム全体の親として ngFormController と接して動作することもできます。これを理解するのにしばらく時間がかかりましたので、しばらくお待ちください。
ここでスコープを分離することは避けます。それらはトリッキーになる可能性があり、他のディレクティブと常にうまく連携するとは限りません (したがって、通常は、新しい要素またはディレクティブが 1 つだけ存在するものにのみ使用します)。私は次のようなものを設計します:
return {
restrict: 'E',
template: tpl,
replace: true,
require: 'ngModel',
link: function(scope, element, attrs, ngModelController) {
// Use attrs to access values for attributes you have set on the lement
// Use ngModelController to access the model value and add validation, parsing and formatting
// If you have an attribute that takes an expression you can use the attrs value along with $scope.$watch to check for changes and evaluate it or the $parse service if you just want to evaluate it.
}
カスタム入力は、その機能によっては非常にトリッキーになる可能性があるため、ディレクティブの設計にできるだけ慣れることをお勧めします (+/- ボタンを追加するカスタム入力と、数値をパーセンテージ、通貨、または単に数値としてフォーマットするカスタム入力を構築しました。カンマを入力しながら)。ngModelController ドキュメントとは別に、これらはレビューに役立ちます。