2010-09-01 3 views
0

J'utilise Grails depuis 3 semaines (apprentissage et travail). J'ai travaillé sur le portage d'une application JSP/Servlet à Grails et cela a été un portage "fun" absolu de l'application.Grails: Impossible d'obtenir les données du modèle du contrôleur à afficher

J'ai rencontré un problème et j'ai cherché, lu mais je n'ai pas pu le résoudre pour le moment.

Dans la page GSP, j'ai un champ de texte et un bouton de recherche où l'utilisateur entre ProductID. J'ai un contrôleur qui est appelé de la méthode jQuery Ajax quand un bouton de recherche est cliqué.

 // ----- Part of jQuery Ajax call --- 
$.ajax({ 
     type : "post", 
     url : '/${grailsApplication.metadata['app.name']}/product/checkProductAjax', 
     data : "pid="+proID, 

// ----- Contoller code----- 
class ProductController { 
     def scaffold = true  
      def checkProductAjax = { 
       def product= Product.findByProductId(params.pid) 
       if(product) { 
        [product: product] // model to get data in GSP page.     
         render(product.toString() + ":" + product.id) 
       } else { 
        render("none") 
       } 
      } 
} 

Appel Ajax et tout fonctionne bien. Le problème auquel je suis confronté est comment obtenir le modèle (c.-à-d. Les données de produit à la page GSP par exemple [produit: produit] et l'affichage dans GSP comme par exemple Nom du produit: $ {product}

Comment puis-je l'obtenir J'ai lu des exemples où il est mentionné que le simple paramétrage du produit [product: product] aidera à obtenir les données dans le GSP

Nom du produit: $ {product} indique toujours vide dans la page GSP

S'il vous plaît me dire ce que je fais mal.

Cheers! Jay Chandran

Répondre

2

[product: product] et render(product.toString() + ":" + product.id) sont incompatibles. Lorsque vous voyez une action de contrôleur dont la dernière ligne est une carte comme [product: product], il s'agit de la valeur de retour implicite puisque c'est la dernière déclaration de la fermeture de l'action - c'est l'équivalent de return [product: product]. Mais si vous avez une carte au milieu d'une méthode, elle est simplement créée et rejetée. Il est à peu près équivalente à

def ignoreThisMap = [product: product] 
// other code 

Puisque vous faites un appel Ajax bien, mettre le produit dans le modèle n'a pas de sens puisque vous n'allez réengendrer la GSP. Vous allez rendre du texte, JSON, XML ou tout autre contenu que le JavaScript côté client utilisera pour mettre à jour un sous-ensemble du code HTML. Donc, vous voulez probablement quelque chose plus proche de

if (product) { 
    render product as JSON 
} 
else { 
    render "none" 
} 

et vous pouvez utiliser jQuery ou Prototype pour évaluer le JSON et extraire les données dans votre JavaScript.

+0

Bonjour, Merci pour le conseil. Je devrais avoir à ce sujet. :) Je rends maintenant le produit au format JSON et dans la page utilisant jQuery, j'obtiens les valeurs requises! Merci beaucoup ... :) –

0

vous voudrez probablement utiliser les étiquettes de grails créées pour ce type de travail; elle enveloppe le code AJAX tout pour vous

http://www.grails.org/Ajax

Questions connexes