Pobieranie formantów z FormController

Potrzebuję sposobu na przejście przez zarejestrowane kontrolki formularza AngularJS. Zasadniczo próbuję uzyskać wszystkie kontrolki $ dirty, ale nie ma tablicy kontrolek (kontroler FormController ma wiele różnych właściwości / funkcji oprócz samych kontrolek - każdy jako własny obiekt).

Patrzyłem na kod źródłowy i widzę, że istniejecontrols tablica w kontrolerze FormController, który jest dokładnie tablicą, której szukam. Czy istnieje sposób na uzyskanie dostępu do tej wartości lub rozszerzenie kontrolera FormController w celu uwzględnienia funkcji, która to zwracacontrols szyk?

Edytować:Plnkr próbny

Również zdałem sobie sprawę, że technicznie mogę sprawdzić pierwszy znak w łańcuchu kluczowym dla „$”, ale chciałbym uniknąć tego w przypadku, gdy dyrektywa FormController / dyrektywa zmienia się w przyszłej wersji Angular.

Edytuj 2: Kolejne wyjaśnienie: Moim celem w tym wszystkim jest umożliwienie określenia, które konkretne pola są $ brudne, czy przez zapętlenie całej listy kontrolek (nie licząc $ dirty, $ invalid, $ error, $ name, i inne właściwości, które żyją w obiekcie Form w takiej postaci, w jakiej się znajdują) lub przez rozszerzenie kontrolera FormController i utworzenie funkcji, która zwraca tylko elementy sterujące, które są aktualnie brudne (i nie równe ich wartościom początkowym)

Edytuj 3: Rozwiązanie, którego szukam, musi mieć zastosowanie do form / modeli różnych struktur. Modele w zasięgu są generowane przez AJAX, więc ich struktura jest już ustawiona (chciałbym uniknąć konieczności kodowania nowej struktury dla wszystkich danych, które już otrzymuję za pośrednictwem AJAX). Ponadto staram się używać tego procesu przesyłania formularza w wielu formularzach / modelach, a każdy z nich ma różne struktury JSON - tak jak w przypadku różnych elementów w naszym modelu obiektów. Dlatego zdecydowałem się poprosić o sposób uzyskania dostępu docontrols obiekt w kontrolerze FormController (wyślę kod zFormController poniżej), ponieważ jest to jedyne miejsce, w którym mogę uzyskać płaski zestaw wszystkich moich pól.

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
}

Jak widać, sama forma macontrols tablica dostępna prywatnie. Zastanawiam się, czy jest jakiś sposób na przedłużenieFormController więc mogę upublicznić ten obiekt? Lub utwórz funkcję publiczną, aby móc przynajmniej wyświetlić tablicę prywatną?

questionAnswers(4)

yourAnswerToTheQuestion