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.
Vous devez vous connecter pour publier un commentaire.
Pour une solution directe à la question, modifier @lombardo réponse comme;
Le tableau "dirtyFormControls' contient alors les contrôles de formulaire qui sont sales.
Vous pouvez également utiliser cette astuce pour afficher les messages d'erreur sur le formulaire de soumission pour "Requis" des validations et de tous les autres. Dans votre submit() fonction que vous allez faire quelque chose comme;
Et dans votre formulaire vous permettra d'afficher les messages d'erreur avec
La solution ci-dessus est utile lorsque vous avez généré dynamiquement des contrôles à l'aide de "ng-repeat" ou quelque chose de similaire.
Vous pouvez utiliser le code suivant pour parcourir les contrôles:
typeof value === 'object' &&
à votre condition if. Sinon, vous pouvez obtenir des erreurs comme "TypeError: Cannot read property 'hasOwnProperty' undefined"typeof null
est aussi un objet.essayez simplement à partir de votre contrôleur:
Mise à JOUR:
FormController
Je suis venu avec un peu décent de solution, mais il n'est toujours pas ce que je cherchais. J'ai récupéré un peu de code à partir d'un autre problème impliquant la création d'objets JSON à partir de chaînes, et de venir avec les éléments suivants:
Essentiellement, je suis de nommage de mes champs de la même manière qu'ils sont attachés au modèle, puis la construction d'un nouvel objet pour la présentation lors de la form_submit est appelé.
Plnkr démo
Dans la démo, si vous modifiez l'un des champs du formulaire, puis cliquez sur envoyer, vous verrez l'objet pop up avec seulement la sale de valeurs.