2014-01-30 85 views
5

我想直接在視圖中通過嵌入數據將數據從控制器傳遞到JavaScript。 (所以不會有額外的請求。)將數據從控制器傳遞到GSP中的JavaScript

我的第一個解決方案是使用as JSON在GSP這樣的:

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

我不認爲這是個好主意,因爲我必須使用(Grails的2.2 )

grails.views.default.codec = "none" 

或(Grails的2.3)

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

現在,我發現我可以創建小標籤庫是這樣的:

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

我可以在GSP使用下面的代碼:

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

現在的問題。使用taglib是最佳實踐嗎?如果沒有,請給我最好的解決方案。

+0

如何從控制器發送json字符串到視圖,並使用'$ {json.encodeAsJavaScript()}'? –

+0

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

+2

呵呵,在這種情況下您需要原始數據。 '$ {raw(json)}' –

回答

3

將答案轉換爲答案。您可以在控制器中創建JSON字符串並將其傳遞給視圖。 Grails 2.3.x具有不編碼您的內容的原始編解碼器。有關這個編解碼器的更多信息here

實施例:使用Grails 2.4.4

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

index.gsp中

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

現在,我升級到3.2.4的Grails。我發現SérgioMichels的方法仍然有效。只要確保jsonStringString對象。

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

如果它不是String對象,則可以使用類似下面的代碼。

<script> 
    var data = ${raw(mapInstance.encodeAsJSON().toString)}; 
</script> 
相關問題