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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage