2014-01-30 15 views
5

Ich möchte Daten von Controller zu JavaScript durch eingebettete Daten direkt im Blick übergeben. (So ​​gibt es keine weiteren Anfragen werden.)Übergeben von Daten vom Controller zu JavaScript in GSP

Meine erste Lösung ist as JSON in GSP wie folgt zu verwenden:

<script> 
    var data = ${invoice as JSON}; 
</script> 

Ich glaube nicht, dass es gute Idee, da ich verwenden (Grails 2.2

)
grails.views.default.codec = "none" 

oder (Grails 2,3)

grails { 
    views { 
    gsp { 
     codecs { 
     expression = 'none' 
     } 
    } 
    } 
} 

Nun fand ich, dass ich etwas schaffen kann TagLib wie folgt aus:

def json = { attrs, body -> 
    out << (attrs.model as JSON) 
} 

Und ich kann folgenden Code in GSP verwenden:

<script> 
    var data = <g:json model="${invoice}" />; 
</script> 

nun die Frage. Ist die Verwendung von Taglib die beste Vorgehensweise? Wenn nicht, bitte geben Sie mir die beste Lösung.

+0

Wie wäre es mit dem Senden der JSON-String vom Controller an die Ansicht, und mit '$ {json.encodeAsJavaScript()}'? –

+0

encodeAsJavaScript() gibt mir: 'var data = \ u007b \ u0022key1 \ u0022: \ u0022val1 \ u0022 \ u002c \ u0022key2 \ u0022: 3.14 \ u007d' – Meam

+2

Ach ja, in diesem Fall brauchst du die Rohdaten. '$ {roh (json)}' –

Antwort

3

Den Kommentar in Antwort umwandeln. Sie können Ihre JSON-Zeichenfolge im Controller erstellen und an die Ansicht übergeben. Grails 2.3.x haben den rohen Codec, der deinen Inhalt nicht kodiert. Weitere Informationen zu diesem Codec here.

Beispiel:

class MyController { 
    def index() { 
    String invoiceString = invoice as JSON 
    [json: invoiceString] 
    } 
} 

index.gsp

<script> 
    var data = ${raw(json)}; 
</script> 
0

Jetzt bin ich ein Upgrade 3.2.4 auf Grails. Ich fand, dass die Methode von Sérgio Michels immer noch funktioniert. Stellen Sie nur sicher jsonString ist ein String Objekt.

<script> 
    var data = ${raw(jsonString)}; 
</script> 

Wenn es sich nicht um eine String Objekt, können Sie so etwas wie folgenden Code verwenden.

<script> 
    var data = ${raw(mapInstance.encodeAsJSON().toString)}; 
</script> 
Verwandte Themen