AngularJS フォームの登録済みコントロールをループする方法が必要です。基本的に、私はすべての $dirty コントロールを取得しようとしていますが、コントロールの配列はありません (FormController には、コントロール自体を含むだけでなく、それぞれ独自のオブジェクトとしてさまざまなプロパティ/関数があります)。
ソース コードを調べたところ、探しているcontrols
配列とまったく同じ配列が FormController にあることがわかりました。この値にアクセスする方法、または FormController を拡張してこのcontrols
配列を返す関数を含める方法はありますか?
編集: Plnkrデモ
また、技術的には「$」のキー文字列の最初の文字をチェックできることに気付きましたが、Angular の将来のバージョンで FormController/ディレクティブが変更された場合に備えて、それを避けたいと思います。
編集 2: 別の説明: このすべての私の目標は、コントロールのリスト全体をループするかどうかにかかわらず、どの特定のフィールドが $dirty であるかを判断できるようにすることです ($dirty、$invalid、$error、$name、および Form オブジェクトにそのまま存在するその他のプロパティ) または FormController を拡張し、現在ダーティな (そしてそれらの開始値と等しくない) コントロールのみを返す関数を作成します。
編集 3: 私が探しているソリューションは、さまざまな構造のフォーム/モデルに適用できる必要があります。スコープのモデルは AJAX を介して生成されるため、構造は既に設定されています (AJAX を介して既に受信しているすべてのデータに対して新しい構造をハードコーディングする必要はありません)。また、このフォーム送信プロセスを複数のフォーム/モデルで使用することを検討していますが、オブジェクト モデルのさまざまなエンティティに適用されるため、それぞれが異なる JSON 構造を持っています。これが、すべてのフィールドのフラットな配列を取得できる唯一の場所であるためcontrols
、FormController 内のオブジェクトにアクセスする方法を求めることを選択した理由です(以下からコードを投稿します)。FormController
function FormController(element, attrs) {
var form = this,
parentForm = element.parent().controller('form') || nullFormCtrl,
invalidCount = 0, // used to easily determine if we are valid
errors = form.$error = {},
controls = [];
// init state
form.$name = attrs.name || attrs.ngForm;
form.$dirty = false;
form.$pristine = true;
form.$valid = true;
form.$invalid = false;
parentForm.$addControl(form);
// Setup initial state of the control
element.addClass(PRISTINE_CLASS);
toggleValidCss(true);
// convenience method for easy toggling of classes
function toggleValidCss(isValid, validationErrorKey) {
validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
element.
removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).
addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);
}
/**
* @ngdoc function
* @name ng.directive:form.FormController#$addControl
* @methodOf ng.directive:form.FormController
*
* @description
* Register a control with the form.
*
* Input elements using ngModelController do this automatically when they are linked.
*/
form.$addControl = function(control) {
controls.push(control);
if (control.$name && !form.hasOwnProperty(control.$name)) {
form[control.$name] = control;
}
};
/**
* @ngdoc function
* @name ng.directive:form.FormController#$removeControl
* @methodOf ng.directive:form.FormController
*
* @description
* Deregister a control from the form.
*
* Input elements using ngModelController do this automatically when they are destroyed.
*/
form.$removeControl = function(control) {
if (control.$name && form[control.$name] === control) {
delete form[control.$name];
}
forEach(errors, function(queue, validationToken) {
form.$setValidity(validationToken, true, control);
});
arrayRemove(controls, control);
};
// Removed extra code
}
ご覧のとおり、フォーム自体にはcontrols
非公開で使用できる配列があります。FormController
そのオブジェクトを公開できるように拡張する方法があるかどうか疑問に思っていますか? または、少なくともプライベート配列を表示できるようにパブリック関数を作成しますか?