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ą?