J'ai une application où je suis constamment confronté à un besoin d'ajouter/supprimer dynamiquement un groupe de champs d'un à plusieurs relations d'objets de domaine dans les formulaires. Les champs peuvent être des champs de texte, des sélections, des boutons radio, etc. Je ne trouve pas d'approche simple pour le faire. Pour cela la meilleure solution selon moi aurait été de rendre une div en utilisant mes tags grails dans une chaîne javascript et d'ajouter des divs supprimer sur le formulaire.
E.g. en cliquant sur AjouterGSP fragment alternative pour l'utilisation de javascript dans Grails
var vector = $.parseHTML('<div><label>Vector:</label><g:select from="${..}" /><g:text......');
$("#vectorDiv").append(vector);
Mais l'approche ne fonctionne pas pour diverses raisons. Un étant javascript ne permet pas de nouvelles lignes dans la chaîne (sans un/à la fin que je ne peux pas appliquer avec des étiquettes de grails).
Je ne veux pas encore commencer à utiliser React. Just jquery et étiquettes de grails.
Je voulais obtenir quelques opinions sur ce "modèle de conception" si vous voulez. rendre une div dans mon gsp.
<!--templates-->
<div id="templates" hidden>
<div id="templateAccessoryVector" class="form-group accessoryVector">
<div class="col-sm-4">
<g:select class="form-control" name="accessoryVectorsTemplate.vectorId"
from="${Vector.getAccessoryVectors()}" optionKey="id" optionValue="alias" />
</div>
<label class="control-label col-sm-2">Percentage:</label>
<div class="col-sm-2 input-group">
<g:textField class="form-control text-right" name="accessoryVectorsTemplate.percentage" />
<span class="input-group-addon">%</span>
</div>
</div>
</div>
puis en javascript
var templateAccessoryVectorDiv = $("#templateAccessoryVector").removeAttr('id');
function addAccessoryVector(){
var newAccessoryVectorDiv = templateAccessoryVectorDiv.clone();
$("[name^='accessoryVectorsTemplate']", newAccessoryVectorDiv).each (function(index, element) {
element.name = element.name.replace('accessoryVectorsTemplate', 'accessoryVectors[' + accessoryVectors + ']');
});
newAccessoryVectorDiv.appendTo($("#accessoryVectors"));
accessoryVectors++;
}
//add, remove functions
Tous ces modèles pourraient vivre dans la section modèles, caché et utilisé en cas de besoin.
Telle est l'approche que nous prenons pour ce genre de dynamique ajouter/supprimer des éléments interfacer tout le temps. Nous utilisons GSP pour rendre les éléments d'addition et les obtenir via les appels JQuery AJAX. –