Frage

Ich habe mit Grails für die letzten 3 Wochen (Lernen und Arbeit). Ich habe eine JSP / Servlet-Anwendung Grails arbeitet an der Portierung und es hat absolut „Spaß“ gewesen Portierung der Anwendung.

Ich habe ein Problem gegenüber und habe Such gewesen, zu lesen, kann es aber noch nicht lösen.

In der APS-Seite habe ich ein Textfeld und Schaltfläche suchen, wo Benutzer ProductID eintreten. Ich habe einen Controller, der von jQuery Ajax-Methode aufgerufen wird, wenn eine Suchtaste geklickt wird.

 // ----- 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")
                }
          }
}

Ajax-Aufruf und alles funktioniert. Das Problem, das ich bin vor, wie das Modell zu erhalten (das heißt die Produktdaten zurück zur GSP Seite d [Produkt:] und Anzeige im GSP wie beispielsweise Produktnamen: $ {product}

Wie kann ich es zu arbeiten? Ich habe Beispiele gelesen, wo es erwähnt wird, dass nur das Modell setzen. [Produkt:] wird dazu beitragen, die Daten in GSP zu bekommen

Produktname: $ {Produkt} immer leer zeigt in der APS-Seite Produktname:

Bitte sagen Sie mir, was ich falsch mache.

Prost! Jay Dran

War es hilfreich?

Lösung

[product: product] und render(product.toString() + ":" + product.id) sind nicht kompatibel. Wenn Sie eine Controller-Aktion, deren letzte Zeile ist eine Karte, wie [product: product] sehen, ist dies der impliziten Rückgabewert, da es die letzte Anweisung des Verschluss - es ist das Äquivalent von return [product: product]. Aber wenn Sie eine Karte in der Mitte einer Methode haben, ist es gerade erstellt und verworfen. Es ist so ziemlich gleichwertig

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

Da Sie einen Ajax-Aufruf machen aber das Produkt im Modell setzen nicht sinnvoll, da Sie nicht das APS neu machen werden. Du gehst Text, JSON, XML oder einen anderen Inhalt zu machen, dass die clientseitige JavaScript verwenden, werden einige Teilmenge der HTML-Dateien zu bearbeiten. So dass Sie wahrscheinlich etwas näher an

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

und dann können Sie jQuery oder Prototype verwenden, um die JSON zu bewerten und die Daten in Ihrem JavaScript extrahieren.

Andere Tipps

Sie wahrscheinlich wollen die Grails-Tags verwenden, die für diese Art von Arbeit geschaffen werden; es hüllt den AJAX-Code für Sie alle oben

http://www.grails.org/Ajax

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top