J’utilise cette méthode: http://plnkr.co/edit/A6gvyoXbBd2kfToPmiiA?p=preview pour valider uniquement les champs flous. Cela fonctionne bien, mais je voudrais aussi les valider (et donc montrer les erreurs éventuelles pour ces champs) lorsque l’utilisateur clique sur le bouton “Soumettre” (pas un appel réel mais un appel à une fonction par clic de données)
Est-il possible de déclencher une validation sur tous les champs lorsque vous cliquez sur ce bouton?
Ce qui a fonctionné pour moi a été d’utiliser la fonction $setSubmitted
, qui apparaît d’abord dans les documents angulars de la version 1.3.20.
Dans l’événement click où je voulais déclencher la validation, j’ai fait ce qui suit:
vm.sortingggerSubmit = function() { vm.homeForm.$setSubmitted(); ... }
C’était tout ce qu’il fallait pour moi. Selon les documents, il “définit le formulaire à son état soumis”. C’est mentionné ici .
Je sais, il est un peu trop tard pour répondre, mais tout ce que vous avez à faire est de forcer toutes les formes à se salir. Jetez un coup d’oeil à l’extrait suivant:
angular.forEach($scope.myForm.$error.required, function(field) { field.$setDirty(); });
et ensuite vous pouvez vérifier si votre formulaire est valide en utilisant:
if($scope.myForm.$valid) { //Do something }
et enfin, je suppose, vous voudriez changer votre itinéraire si tout semble bon:
$location.path('/somePath');
Edit : le formulaire ne s’enregistrera pas sur la scope tant que l’événement d’envoi n’est pas un déclencheur. Utilisez simplement la directive ng-submit pour appeler une fonction et placez-la dans cette fonction, et cela devrait fonctionner.
Au cas où quelqu’un y reviendrait plus tard … Rien de ce qui précède n’a fonctionné pour moi. J’ai donc creusé dans les entrailles de la validation de forme angular et trouvé la fonction qu’ils appellent pour exécuter des validateurs sur un champ donné. Cette propriété s’appelle commodément $validate
.
Si vous avez un formulaire nommé myForm
, vous pouvez appeler par programme myForm.my_field.$validate()
pour exécuter la validation de champ. Par exemple:
Notez que l’appel de $validate
a des implications pour votre modèle. À partir des documents angulars de ngModelCtrl. $ Valider:
Exécute chacun des validateurs enregistrés (premiers validateurs synchrones puis validateurs asynchrones). Si la validité devient invalide, le modèle sera défini sur indéfini, à moins que ngModelOptions.allowInvalid soit true. Si la validité passe à valide, le modèle sera défini sur le dernier $ modelValue valide disponible, c’est-à-dire la dernière valeur analysée ou la dernière valeur définie dans l’étendue.
Donc, si vous prévoyez de faire quelque chose avec la valeur de modèle non valide (comme si un message le lui disait), vous devez vous assurer que allowInvalid
est défini sur true
pour votre modèle.
Vous pouvez utiliser Angular-Validator pour faire ce que vous voulez. C’est simple à utiliser.
Ce sera:
$dirty
ou sur submit
$dirty
ou que le formulaire est soumis Voir la démo
Exemple
Si le champ ne passe pas le validator
l’utilisateur ne pourra pas soumettre le formulaire.
Découvrez des exemples d’utilisation de validateurs angulars et des exemples pour plus d’informations.
Disclaimer: Je suis l’auteur de Angular-Validator
Eh bien, la manière angular serait de laisser gérer la validation – car elle le fait à chaque changement de modèle – et ne montrerait le résultat à l’utilisateur que lorsque vous le souhaitez.
Dans ce cas, vous décidez quand afficher les erreurs, il vous suffit de définir un indicateur: http://plnkr.co/edit/0NNCpQKhbLTYMZaxMQ9l?p=preview
Pour autant que je sache, il y a un problème déposé à angular pour nous permettre d’avoir un contrôle de forme plus avancé. Comme il n’est pas résolu, j’utiliserais ceci au lieu de réinventer toutes les méthodes de validation existantes.
edit: Mais si vous insistez sur votre chemin, voici votre violon modifié avec validation avant de le soumettre. http://plnkr.co/edit/Xfr7X6JXPhY9lFL3hnOw?p=preview Le contrôleur diffuse un événement lorsque l’utilisateur clique sur le bouton et la directive effectue la validation.
Une approche consiste à forcer tous les atsortingbuts à être sales. Vous pouvez le faire dans chaque contrôleur, mais cela devient très compliqué. Il serait préférable d’avoir une solution générale.
La manière la plus simple de penser était d’utiliser une directive
Voici la directive
myModule.directive('submit', function() { return { ressortingct: 'A', link: function(scope, formElement, attrs) { var form; form = scope[attrs.name]; return formElement.bind('submit', function() { angular.forEach(form, function(field, name) { if (typeof name === 'ssortingng' && !name.match('^[\$]')) { if (field.$pristine) { return field.$setViewValue(field.$value); } } }); if (form.$valid) { return scope.$apply(attrs.submit); } }); } }; });
Et mettez à jour votre formulaire HTML, par exemple:
devient:
Voir un exemple complet ici: http://plunker.co/edit/QVbisEK2WEbORTAWL7Gu?p=preview
Sur la base de la réponse de Thilak, j’ai pu trouver cette solution …
Étant donné que mes champs de formulaire affichent uniquement des messages de validation si un champ est invalide et a été touché par l’utilisateur, j’ai pu utiliser ce code déclenché par un bouton pour afficher mes champs non valides:
// Show/sortinggger any validation errors for this step angular.forEach(vm.rfiForm.stepTwo.$error, function(error) { angular.forEach(error, function(field) { field.$setTouched(); }); }); // Prevent user from going to next step if current step is invalid if (!vm.rfiForm.stepTwo.$valid) { isValid = false; }
this field is required
Voici ma fonction globale pour afficher les messages d’erreur du formulaire.
function show_validation_erros(form_error_object) { angular.forEach(form_error_object, function (objArrayFields, errorName) { angular.forEach(objArrayFields, function (objArrayField, key) { objArrayField.$setDirty(); }); }); };
Et dans mes contrôleurs,
if ($scope.form_add_sale.$invalid) { $scope.global.show_validation_erros($scope.form_add_sale.$error); }
Pour valider tous les champs de mon formulaire quand je veux, je fais une validation sur chaque champ de contrôles $$ comme ceci:
angular.forEach($scope.myform.$$controls, function (field) { field.$validate(); });
Note: Je sais que c’est un hack, mais c’était utile pour Angular 1.2 et les versions antérieures qui ne fournissaient pas de mécanisme simple.
La validation intervient sur l’événement de modification , de sorte que certaines choses, comme modifier les valeurs par programmation, ne le déclencheront pas. Mais déclencher l’événement de changement déclenchera la validation. Par exemple, avec jQuery:
$('#formField1, #formField2').sortinggger('change');
J’aime cette approche dans la gestion de la validation par clic sur un bouton.
Il n’y a pas besoin d’invoquer quoi que ce soit du contrôleur,
tout est traité avec une directive.
sur github
Vous pouvez essayer ceci:
// The controller $scope.submitForm = function(form){ //Force the field validation angular.forEach(form, function(obj){ if(angular.isObject(obj) && angular.isDefined(obj.$setDirty)) { obj.$setDirty(); } }) if (form.$valid){ $scope.myResource.$save(function(data){ //.... }); } }
J’ai fait quelque chose pour que ça marche.
Dans votre contrôleur, vous pouvez faire
addHeader(form, header){ let self = this; form.$submitted = true; ... }
Vous avez besoin de css aussi;
.label-color { color: $gray-color; } .has-error { .label-color { color: rgb(221, 25, 29); } .select2-choice.ui-select-match.select2-default { border-color: #e84e40; } } .validation-message { font-size: 0.875em; } .max-width { width: 100%; min-width: 100%; }