8
votes

Comment valider des champs de formulaire dynamique dans la directive angulaire?

Je voudrais créer un formulaire avec des champs créés dans la directive. La liaison des données des données fonctionnant correctement mais la validation ne fonctionne pas.

Ceci est HTML: P>

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
    $scope.data = {name: '', age: ''}
    $scope.config = [
        {field: 'name', required:true},
        {field: 'age'}
    ];
});

app.directive('field', function ($compile) {
    return {
        scope: {
            data: '=',
            conf: '='
        },
        link: function linkFn(scope, element, attrs) {
            // field container
            var row = angular.element('<div></div>');

            // label
            row.append(scope.conf.field + ': ');

            // field input
            var field = angular.element('<input type="text" />');
            field.attr('name', scope.conf.field);
            field.attr('ng-model', 'data.' + scope.conf.field);
            if (scope.conf.required) {
                field.attr('required', 'required');
            }
            row.append(field);

            // validation
            if (scope.conf.required) {
                var required = angular.element('<span>required</span>');
                required.attr('ng-show', 
                    'form.' + scope.conf.field + '.$error.required');
                row.append(required);
            }

            $compile(row)(scope);
            element.append(row);
        }
    }
});


1 commentaires

Je me lève avec le même problème. J'ai trouvé une fonctionnalité non documentée dans la source angulaire: formontroller a des méthodes $ addControl et $ removecontrol . Je pense que vous devez appuyer sur ces méthodes pour ajouter de manière dynamique des contrôles au parent formelController dans la directive. Vous fera savoir si je réussirai.


3 Réponses :


2
votes

Vous devrez utiliser directive NG-Form et poussez la dynamique champ directement dans l'objet de formulaire.

Ce fil peut vous aider: https://github.com/angular/angular.js/issues/1404


0 commentaires

5
votes

TODO: strong>

avant: strong> p> xxx pré>

après: strong> p> xxx pré>

p / s dans 'planker' pour les installations Ajouter CSS: strong> p>

.ng-invalid {
  border: 1px solid red;
}


1 commentaires

Bien que hautement obscur, c'est en fait une réponse. Devrait être accepté dès que possible



0
votes

Voici un plunker forcé de votre part pour résoudre votre problème: http://plnkr.co/edit/qompo-shirtmiznbndf?p=preview

à Résumez, j'ai ajouté une montre qui bascule le message d'erreur au lieu d'utiliser la directive NG-Show. Les choses peuvent devenir poilues lorsque vous essayez de ajouter de manière dynamique une directive dans un lien de directive. Pour un cas d'utilisation simple, il est plus rapide d'ajouter votre propre montre.

Vous pouvez également examiner cette directive préconfigurée pour gérer de nombreux cas d'utilisation pour validation et vous permettre de créer des validations personnalisées. facilement https://github.com/nelsonomuto/angular-u-form-validation xxx


0 commentaires