C'est possible et voici comment je fais la même chose avec un tableau d'entrées.
envelopper le tableau dans un formulaire comme suit
Alors, utilisez simplement ceci
J'ai un formulaire avec des directives multi-encastrées qui contiennent toutes des entrées, des sélections, etc... Ces éléments sont tous enfermés dans des ng-repeats, et des valeurs de chaîne dynamiques.
Voici comment utiliser la directive :
<form name="myFormName">
<nested directives of many levels>
<your table here>
<perhaps a td here>
ex: <input ng-repeat=(index, variable) in variables" type="text"
my-name="{{ variable.name + '/' + 'myFormName' }}"
ng-model="variable.name" required />
ex: <select ng-model="variable.name" ng-options="label in label in {{ variable.options }}"
my-name="{{ variable.name + index + '/' + 'myFormName' }}"
</select>
</form>
Note : vous pouvez ajouter un index à la concaténation de la chaîne si vous avez besoin de sérialiser peut-être un tableau d'entrées ; ce que j'ai fait.
app.directive('myName', function(){
var myNameError = "myName directive error: "
return {
restrict:'A', // Declares an Attributes Directive.
require: 'ngModel', // ngModelController.
link: function( scope, elem, attrs, ngModel ){
if( !ngModel ){ return } // no ngModel exists for this element
// check myName input for proper formatting ex. something/something
checkInputFormat(attrs);
var inputName = attrs.myName.match('^\\w+').pop(); // match upto '/'
assignInputNameToInputModel(inputName, ngModel);
var formName = attrs.myName.match('\\w+$').pop(); // match after '/'
findForm(formName, ngModel, scope);
} // end link
} // end return
function checkInputFormat(attrs){
if( !/\w\/\w/.test(attrs.rsName )){
throw myNameError + "Formatting should be \"inputName/formName\" but is " + attrs.rsName
}
}
function assignInputNameToInputModel(inputName, ngModel){
ngModel.$name = inputName
}
function addInputNameToForm(formName, ngModel, scope){
scope[formName][ngModel.$name] = ngModel; return
}
function findForm(formName, ngModel, scope){
if( !scope ){ // ran out of scope before finding scope[formName]
throw myNameError + "<Form> element named " + formName + " could not be found."
}
if( formName in scope){ // found scope[formName]
addInputNameToForm(formName, ngModel, scope)
return
}
findForm(formName, ngModel, scope.$parent) // recursively search through $parent scopes
}
});
Cela devrait permettre de gérer de nombreuses situations où vous ne savez pas où se trouvera le formulaire. Ou peut-être avez-vous des formulaires imbriqués, mais pour une raison quelconque, vous voulez attacher ce nom d'entrée à deux formulaires supérieurs ? Il suffit de passer le nom du formulaire auquel vous voulez attacher le nom de l'entrée.
Ce que je voulais, c'était un moyen d'attribuer des valeurs dynamiques à des entrées que je ne connaîtrai jamais, puis d'appeler simplement $scope.myFormName.$valid.
Vous pouvez ajouter tout ce que vous souhaitez : plus de tables, plus d'entrées de formulaire, des formulaires imbriqués, tout ce que vous voulez. Passez simplement le nom du formulaire sur lequel vous voulez valider les entrées. Puis, lors de l'envoi du formulaire, demandez si la valeur $scope.yourFormName.$valid
5 votes
Pour ceux qui lisent ceci en 2015... la réponse la plus votée n'est plus la bonne. Regardez plus bas. :)
0 votes
Ce site semble être la réponse "pour 2015" dont parle @WillStrohl.
0 votes
Quelle est l'étiquette appropriée pour les SO ici ? Devrais-je laisser la réponse acceptée puisqu'elle était correcte à l'époque ou accepter la réponse correcte d'aujourd'hui ? Je veux juste que ce fil apparemment populaire soit utile aux nouveaux visiteurs.
0 votes
@PFranchise, je ne sais pas mais je pense qu'une note visible à ce sujet pourrait aider. Peut-être en tant que modification de votre question, de sorte que la note reste là où plus de gens peuvent la voir.