Formularsteuerelemente von FormController abrufen
Ich brauche eine Möglichkeit, die registrierten Steuerelemente eines AngularJS-Formulars zu durchlaufen. Im Wesentlichen versuche ich, alle $ dirty-Steuerelemente abzurufen, aber es gibt kein Array der Steuerelemente (der FormController verfügt neben den Steuerelementen selbst über eine Reihe verschiedener Eigenschaften / Funktionen - jedes als eigenes Objekt).
Ich habe mir den Quellcode angesehen und sehe, dass es einen gibtcontrols
Array im FormController, das genau das Array ist, das ich suche. Gibt es eine Möglichkeit, auf diesen Wert zuzugreifen oder den FormController um eine Funktion zu erweitern, die dies zurückgibtcontrols
Array?
Bearbeiten:Plnkr Demo
Außerdem wurde mir klar, dass ich technisch gesehen das erste Zeichen in der Schlüsselzeichenfolge auf "$7$quot; prüfen kann, aber ich möchte dies vermeiden, falls sich der FormController / die Direktive in einer zukünftigen Version von Angular ändert.
Edit 2: Eine weitere Klarstellung: Mein Ziel dabei ist es zu bestimmen, welche Felder $ dirty sind, ob durch Durchlaufen der gesamten Liste der Steuerelemente (ohne $ dirty, $ invalid, $ error, $ name, und andere Eigenschaften, die im Form-Objekt wie es ist vorhanden sind) oder durch Erweitern des FormControllers und Erstellen einer Funktion, die nur die Steuerelemente zurückgibt, die derzeit fehlerhaft sind (und nicht ihren Startwerten entsprechen)
Edit 3: Die Lösung, nach der ich suche, muss auf Formen / Modelle unterschiedlicher Strukturen anwendbar sein. Die Modelle für den Bereich werden über AJAX generiert, daher ist ihre Struktur bereits festgelegt (ich möchte vermeiden, dass für alle Daten, die ich bereits über AJAX erhalte, eine neue Struktur fest codiert werden muss). Außerdem möchte ich diesen Formularübermittlungsprozess für mehrere Formulare / Modelle verwenden. Jedes dieser Formulare weist unterschiedliche JSON-Strukturen auf - da sie für verschiedene Entitäten in unserem Objektmodell gelten. Aus diesem Grund habe ich mich entschieden, nach einem Weg zu fragen, wie ich Zugang zum Internet erhaltecontrols
Objekt im FormController (ich poste den Code vonFormController
unten), weil es der einzige Ort ist, an dem ich eine flache Anordnung aller meiner Felder erhalten kann.
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
}
Wie Sie sehen können, hat das Formular selbst diecontrols
Array privat verfügbar. Ich frage mich, ob es für mich eine Möglichkeit gibt, die zu verlängernFormController
damit ich das Objekt veröffentlichen kann? Oder eine öffentliche Funktion erstellen, damit ich zumindest das private Array anzeigen kann?