2017-02-18 1 views
0

Ici, j'ai une carte de hachage passée du contrôleur à la page GSP.Comment comparer dynamiquement la clé de la table de hachage dans la fermeture de Grails?

Controller:

Map<String, List<String>> nameFiles = new HashMap<String, List<String>>();

nameFiles.put('patient1',["AA","BB","CC"]); 
    nameFiles.put('patient2',["DD","EE","FF"]); 

model.put("nameFiles", nameFiles);

Page GSP:

var patient = getPatient(); // permet de dire que nous obtenons au hasard du patient à travers une fonction jQuery, pourrait être pas disponible dans la nomFichiersFichier

//check If nameFiles contain key same as patient varaible 
<% nameFiles.each { fm -> %> 
    <% if (fm.containsKey(patient)) { %> // This if statement cannot compare dynamic sting varaaible. How to do this. 
     alert("Yes nameFiles contain the patient"); 
    <% } %> 
<% } %> 
+1

Je ne vois aucun code jQuery. "ne fonctionne pas" n'est pas une très bonne description du problème. Vous obtenez des erreurs ou vous voyez une mauvaise sortie? S'il vous plaît être plus détaillé. – 4castle

+0

J'ai un élément clé appelé randomName dans le NameFiles Hashmap donc quand <% if (fm.containsKey (patientIdentifier)) {%> alert ("YES"); <% } %> Je devrais supposer voir YES popup message, mais je ne le vois pas – tenzin

+0

@ RenéScheibe: J'ai approuvé votre modification, mais votre correction de convention de nommage appartient correctement à votre réponse. – pyon

Répondre

0

En supposant que vous avez:

Map<String, List<String>> nameFiles = new HashMap<String, List<String>>(); 
      nameFiles.put('patient1',[id:1,name:'Fred']) 
      nameFiles.put('patient2',[id:2,name:'Tom']) 

Il est aussi simple que cela pour obtenir patient actuel:

<% def aa = nameFiles?.find{it.key=='patient1'}?.value %> 
     <g:if test="${aa}"> 
     // we definitely have ${aa} and it has been made null safe 
     <g:if> 

Ce retour {id:1, Name:Fred} sur gsp qui est la liste itération

Mon Dieu tout le reste si c'est comme si vous étiez dans un contrôleur, je comprends pourquoi vous devez faire cela mais ce n'est pas une bonne pratique que vous pourriez simplement créer un tagLib qui prend la valeur actuelle et traite l'entrée en fonction de quelque chose dans une liste donnée ou peut-être contre à la volée.

modifier finale alors que vous pouvez déclarer des variables comme jsp vous pouvez également utiliser

<g:set var="aa" value="${nameFiles?.find{it.key=='patient1'}?.value}" scope="page|session|..."/> 

Par variable par défaut est définie pour la page, mais pourrait être transformé en une variable de session ou l'autre manière, il est beaucoup plus propre que <% %>

Si tout va bien modifier finale

Je pense que les gens devraient réfléchir à ce que leur problème réel est et essayer de présenter clairement le problème OTH Par ailleurs, le public finit par répondre à autre chose en raison de la mauvaise qualité du poste. Si je comprends bien, il se passe quelque chose dans un contrôleur comme dans une liste produite.Le bit manquant doit être que vous faites une forme de vérification de forme peut-être une sélection de boîte de sélection qui finit dans jquery par cela que vous voulez dire que vous avez une forme de vérification de script Java en cours contre un contrôle de champ de formulaire.

Il y a deux façons de pompage telles informations dans le monde javascript pour de telles fins

Méthode 1:

//I haven't tested this, hopefully gives you the idea 
var array = [] 
<g:each in="${namedFiles}" var="${pa}"> 
    array.push({code:'${pa.key} listing:'${pa.value}'}) 
</g:each> 

Méthode 2 Contrôleur

//where you now push named files as a json 
    return [namedFiles as JSON].toString() 

    // or alternatively in gsp javascript segment something like this 
    var results=$.parseJSON('<%=namedFiles.encodeAsJSON()%>'); 
    var results = results['patient1'] 
+0

merci pour la réponse, mais dans mon cas, je reçois patient de la fonction, puis vérifier si ce patient est dans la clé nameFiles. J'ai un peu changé dans ma question, s'il vous plaît laissez-moi savoir si cela rend plus clair – tenzin

+1

Pas du tout vous avez commencé la question sur les cartes contenant la liste de chaînes de contrôleur à gsp. Vous avez ensuite mis à jour pour parler de jquery et votre question parle d'itération de grappes gsp alors que vous l'avez tordu à propos de jquery. Les résultats de Jquery doivent être traités en utilisant le script java – Vahid

0

Déclaration variable dans GSP

Vous pouvez déclarer des variables dans les <% %> entre parenthèses:

<% patientIdentifier = 'randomName' %> 

Pour plus de détails, voir la documentation sur Variables and Scopes Grails.

Vérification si le patient est contenu dans namedFiles

Vous n'avez pas à itérer sur la carte. Juste en vérifiant la carte si elle contient la clé.

// check if nameFiles contains key same as patient variable 
<% if (nameFiles.containsKey(patient)) { %> 
    alert("Yes nameFiles contains the patient"); 
<% } %> 
+0

Je sais déclarer des variables avec <% %> parenthèses mais dans mon cas, je ne peux pas faire cela. – tenzin

+1

Alors s'il vous plaît fournir plus de détails dans votre question à ce sujet. –

+0

J'ai ajouté plus de détails, s'il vous plaît laissez-moi savoir si cela rend plus clair – tenzin

0

Honnêtement, je ne l'ai pas obtenir ce que vous demandez et quel genre de problème avez-vous en conséquence, mais je suppose que vous avez essayé de mettre en œuvre quelque chose comme ça:

<g:if test="${nameFiles[patient]}"> 
    alert("Yes nameFiles contain the patient"); 
</g:if> 

Comme vous pouvez le remarquer j'ai essayé d'éviter le désordre de scriptlet et utilisé des étiquettes personnalisées de grails.

Aussi, j'imagine difficilement comment allez-vous appeler la fonction jQuery pour obtenir une variable et ensuite l'utiliser pour générer une vue sur le côté serveur. Mais essayez d'abord de définir une variable "patient" simulée pour tester mon échantillon. Si la valeur de la variable "patient" est uniquement disponible côté client, vous devez modifier l'approche et générer vos alertes non sur le serveur.

UPD De l'autre côté, vous pouvez retourner vos nameFiles comme JSON dans votre contrôleur, puis analyser ce JSON avec javascript sur le côté client comme ça:

var nameFiles = JSON.parse("${nameFiles}") 

if (nameFiles.hasOwnProperty(patient)) { 
    alert("Yes nameFiles contain the patient"); 
} 

Je n'ai pas tester ce code, mais Au moins vous êtes pointé que gsp sont rendus sur le serveur et vous pouvez convertir votre carte en JSON, le passer à la vue, analyser avec JavaScript et générer l'alerte nécessaire.