フォーム要素ラッパーとして機能する 'wrapper'指示文を作成しました。 1つまたは複数の入力をこのディレクティブの中にラップすることができます。ng-formに触れるかどうかを確認する方法
ディレクティブ自体にng-form
というディレクティブが含まれているため、エラーがあり、(ng-model)入力が無効な場合は、各インスタンスを確認できます。
- フォームが送信され
- OR:
- つ以上の入力が$無効
- としている:私のラッパーテンプレートで は私がするとき 'エラー' クラスを追加します
- 1つまたは複数の入力が$接触された
これは私の現在の(剥奪)のラッパーディレクティブです:
export class FormElementWrapper {
public transclude = true;
public template = `
<div ng-form="formElementWrapper"
ng-class="{'has-error': showError }" ng-transclude>
</div>
`;
public link = (scope, element, attrs) => {
// custom keep track of touched
var touched = false;
var isSubmitted = function(): boolean {
var form: any = scope.formElementWrapper;
return form.$$parentForm.$submitted;
};
scope.$watch(() => {
// show error when:
// - one ore more inputs are invalid
// - AND
// -- form is touched
// -- OR
// -- parent form is submitted
var submitted = isSubmitted();
return scope.formElementWrapper.$invalid && (touched || submitted);
}, (val) => {
scope.showError = val;
});
// override $setPristine to reset the custom touched property
var origPristine = scope.formElementWrapper.$setPristine;
scope.formElementWrapper.$setPristine =() => {
touched = false;
origPristine();
}
// bind to blur events of all inputs
element.on("blur", ":input",() => {
touched = true;
});
}
}
質問:1つの以上の要素が$をしている場合、私は知ることができますどのように触れましたか? ngFormControllerにはそのプロパティはありません。現在私は入力のblur
イベントにバインドしていますが、ng-model
を使用する他のディレクティブは入力そのものである必要はないと思います。
あなたの答えをいただき、ありがとうございます。これは 'フォームとの対話 'として文書化されているので、これを試しましたが、' $ tuched'ではなく '$ dirty'フラグの反対に動作するようです。 – devqon
はい、フォームオブジェクト(モデル) DOM入力要素ではありません。 –
@devqon実際には、ngModelController touchedがngFormControllerに組み込まれていないため、必要に応じて実装する必要があります(途中で難しくありません)。 –