L'obtention de contrôles de formulaire de FormController

J'ai besoin d'un moyen de faire une boucle par les contrôles enregistrés d'un AngularJS forme. Essentiellement, je vais essayer d'obtenir tous les $sale contrôles, mais il n'y a pas de tableau de commandes (FormController a un certain nombre de différentes propriétés/fonctions en plus de contenir les contrôles eux-mêmes - chacun comme son propre objet).

J'ai été en regardant le code source, et je vois qu'il y a un controls tableau dans le FormController c'est exactement le tableau, je suis à la recherche pour. Est-il un moyen pour accéder à cette valeur, ou de prolonger la FormController d'inclure une fonction qui retourne cette controls tableau?

Edit: Plnkr démo

Aussi, j'ai réalisé que, techniquement, j'ai pu tester le premier caractère de la chaîne de clé pour le "$", mais je voudrais éviter qu'en cas de FormController/directive changements dans une future version de Anguleux.

Edit 2: une Autre précision: Mon objectif est d'être capable de déterminer les domaines sont $sale, que ce soit en parcourant l'ensemble de la liste de contrôles (non compris le $sale, $invalide, $erreur, $nom, et d'autres propriétés qui vivent dans la Forme de l'objet comme il est), ou par l'extension de la FormController et la création d'une fonction qui retourne uniquement les commandes qui sont actuellement sale (et ne correspond pas à leurs valeurs de départ)

Edit 3: La solution, je suis à la recherche pour les besoins d'être applicable à des formes/modèles de différentes structures. Les modèles sur le champ d'application sont générés via AJAX, de sorte que leur structure est déjà défini (j'aimerais éviter d'avoir à coder en dur une nouvelle structure pour toutes les données que je suis déjà à la réception via AJAX). Aussi, je suis à la recherche d'utiliser ce formulaire de soumission de processus à travers de multiples formes/modèles, et chacun d'eux sont différents JSON structures - comme ils s'appliquent à des entités différentes dans notre Modèle d'Objet. C'est pourquoi j'ai choisi de poser un moyen d'obtenir l'accès à la controls objet dans le FormController (je vais poster le code de FormController ci-dessous), parce que c'est le seul endroit où je peux obtenir un tableau plat toutes mes champs.

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
}

Comme vous pouvez le voir, la forme elle-même a la controls tableau en privé disponible. Je me demandais si il existe un moyen pour moi de prolonger la FormController pour que je puisse faire l'objet public? Ou de créer une fonction publique afin que je puisse au moins afficher l'array privée?

  • Vous n'avez pas les modèles associés avec les contrôles? Vous pouvez simplement regarder les modèles pour voir si ils ont changé la plutôt qu'en parcourant les contrôles de formulaire.
  • J'ai des modèles, je suis juste essayer d'éviter de faire des montres, car il y a déjà des montres sous la Forme de la directive pour gérer l'ensemble de la sale de vérification, et pour les grandes formes cela peut s'exécuter lentement 🙁
  • Bonne question, c'est la même chose, je suis à la recherche d' (mon but est d'arrêter de validation sur soumettre après la première erreur de la montre). En ce moment, avez-vous trouvé une solution alternative, de mieux que de vérifier pour la première char ($)?
  • Malheureusement, je suis reste encore à vérifier. Si je trouve une meilleure façon, je vais mettre à jour le post.