2010-02-10 6 views
8

Je suis en train de passer quelques paramètres à un remoteFunction dans Grails mais je me bats pour formater correctementGrails remoteFunction de la syntaxe

Je veux passer la valeur d'une donnée sur la page plus la valeur de la zone de texte que je viens à onglets sur, donc dans mon onblur j'ai quelque chose le long des lignes de:

onblur=${remoteFunction(action:'dave', update:'pack'+it.id, 
     params:[denom:document.getElementById(denomValue+${it.id}).value , 
     amount:this.value ])} 

Cela ne compile pas - ni ne les permutations que je peux venir avec des nombre variable de guillemets simples et caractères d'échappement ..

Je thi ce qui me bouscule vraiment, c'est que je ne comprends pas vraiment ce que j'essaye de créer ici. Est-ce que c'est comme si vous utilisiez du code JSP pour créer du JavaScript qui sera ensuite exécuté? Quand est-ce que cette expression est évaluée - c'est au moment où la page est compilée - ou est-ce que a = it au moment où oblur est appelé?

Toute aide grandement appréciée.

Répondre

9

Il semble que vous ayez mélangé du code côté serveur avec du code côté client.

Le code Grails sera évalué lorsque la page est "construite" pour être envoyée au navigateur client.

Le code Javascript sera évalué une fois que la page a été livrée au navigateur.

Dans cet esprit, nous allons jeter un oeil à votre onblur mission:

onblur=${remoteFunction(
     action:'dave', 
     update:'pack'+it.id, 
     params: [denom: document.getElementById(denomValue+${it.id}).value, 
        amount: this.value ])} 

Compte tenu de la $ {...} remoteFunction appel est une balise Grails, il sera évalué sur le serveur, générer un fixe chaîne, puis être envoyé au client. Tout dans l'appel doit être un code Groovy valide.

Regardez la carte params, vous avez ajouté un certain Javascript dans la valeur denom, l'intérieur le code Groovy:

document.getElementById(denomValue 

vous essayez d'ajouter une valeur de Groovy

+${it.id} 

puis encore un peu de Javascript

).value 

Le Groovy c ompiler va essayer d'évaluer le Javascript en tant que code Groovy et échouer.

Si vous avez besoin pour accéder aux paramètres côté client en Javascript, vous devez gérer le Javascript vous (et ne pas utiliser la balise remoteFunction), par exemple pour traiter l'appel à distance:

var path=${createLink(action:'dave', 
         params: [amount:this.value])} 
      + "&denom=" 
      + document.getElementById(denomValue+${it.id}).value 

Vous » Vous devrez également gérer vous-même la réponse à distance en utilisant Javascript pour mettre à jour les éléments 'pack'. Vous pouvez toujours regarder ce que l'appel remoteFunction génère, le copier dans la page et l'éditer pour faire ce que vous voulez.

HTH

+0

+1 pour l'explication technique en profondeur, que beaucoup de gens se mélangent sur. La combinaison de la compréhension côté client et côté serveur peut prêter à confusion, en particulier lorsque les langages côté serveur essaient de générer du Javascript pour vous. Bien que l'approche de tout ce qui se passe dans Javascript soit raisonnable, l'échappement correct de la réponse params peut être plus judicieux pour les one-offs. –

6

Ou vous pouvez passer les paramètres séparés par « & » comme

params:'\'param1=\'+this.value+\'&booleanParam2=true\''

5

Vous pouvez réellement utiliser encore la balise de fonction à distance, il vous suffit d'écrire les paramètres dans un javascript chaîne d'objets, donc cela fonctionne très bien dans les choses avec lesquelles je travaille.

var denomValue = document.getElementById(denomValue+${it.id}).value; 
onblur=${remoteFunction(
    action:'dave', 
    update:'pack'+it.id, 
    params: '{denom: denomValue, amount: this.value}' 
    )} 
0

J'ai eu le même problème, mais toutes les réponses ci-dessus n'a pas aidé à la valeur que je veux obtenir sont la valeur sélectionnée dans le menu déroulant de sélection ainsi que l'instance obj dans la table qui était itérer. ci-dessous était la solution.

<g:select 
              from="${list}" 
             optionKey="value" 
             optionValue="key" 

             onchange="getValue(this.value, ${instance.id})"/> 

    <script type="text/javascript">  
       function getValue(Id1, Id2) 
       { 

        $.ajax({ 
         type: 'POST', 
         url: '/app/controller/functionToCall', 
         data: { someId: Id1, otherId:Id2}, 

        }); 

       } 
2
<button type="button" class="btn btn-success" id="value-pie" onClick="ajaxFunction(this.value)">Confirmar</button> 

<script> 
function ajaxFunction(id){ 
    var obs = $("#observacion").val() 
    var parameters = { "serieId":id, 
         "observacion":obs 
         } 
    <g:remoteFunction controller="control" 
        action="ajax" 
        method="GET" 
        onSuccess="updateModal(data)" 
        params="parameters"/> 
} 
</script> 
+1

belle réponse pour appeler en javascript avec plusieurs paramètres –