2009-01-08 13 views
7

基本上有2個地方,以限定JavaScript函數Grails中,直接在所述GSP一個元件,而根據/ web應用/ JS一個單獨的JavaScript源文件中(例如,應用.js文件)。我們已經在application.js中定義了一個常用的javascript函數,但我們也需要能夠使用groovy代碼動態生成部分函數。不幸的是,$ {一些groovy代碼}似乎沒有在單獨的javascript源文件中處理。執行在JavaScript源常規語句Grails中

是通過GSP網頁上的腳本標籤中定義的JavaScript函數來做到這一點的唯一方法,還是有一個較全面的解決?很顯然,我們可以在模板GSP文件中的腳本標籤中定義javascript函數,這個模板可以被重用,但是爲了讓我們的JavaScript函數在一個地方(即外部javascript源文件)中一起定義,我們需要進行大量的推動。這也具有性能優勢(JavaScript源文件通常僅由每個客戶端的瀏覽器下載一次,而不是在他們訪問的每個html頁面的源內重新加載相同的javascript函數)。我已經玩弄了將功能分解爲靜態和動態片斷的想法,將靜態片斷放在外部源中,並將動態片斷放入模板GSP中,然後將它們粘合在一起,但這似乎是不必要的破解。

任何想法? (編輯:這聽起來像是動態生成JavaScript函數的一部分,然後下載一次並被客戶反覆使用的想法,這可能是一個壞主意,但是,這是一個「動態」只改變一個星期或一個月也許一次,然後只有非常輕微的。主要是我們只是想產生這塊關閉數據庫,哪怕只有一次,而不是硬編碼。)

回答

13

一個簡單的解決方案,讓您的JavaScript不顯眼的是創建一個JavaScriptController和映射其行爲「/ JS/*」,加入這個您UrlMappings.groovy文件:

"/js/$action"{ 
    controller = "javascript" 
} 

然後只需要爲每個你想要的動態JS文件創建一個動作,包含在你的佈局<HEAD>中,並且還有一個JS文件,你可以插入Grails代碼片段! :)

注:我發現,有目前在不文件擴展名的內容類型正確映射Grails的一個bug,所以你需要包括<%@ page contentType="text/javascript; UTF-8" %>在你的視圖文件的頂部。

+0

非常聰明,謝謝 – 2009-01-08 20:44:16

+0

非常歡迎!我上週遇到類似的問題,除了我正在處理CSS文件:) – gabriel 2009-01-08 20:59:32

0

還有另一種方法 - 通過在所生成的代碼到一個期望封閉件的功能。那些關閉是由程序產生的。生成的代碼當然是在gsp頁面中內聯/腳本標記的。

它可以或可以不依賴於代碼的性質工作的產生。但我懷疑它會起作用,如果它沒有,對JavaScript的編碼風格進行微小的調整肯定會使它工作。但是,如果這些'生成'的代碼沒有太大的改變,這相當矯枉過正。

7

這是一個很好的解決方案。我想提供一個建議,使用其他映射

"/js/$action"
之外的東西,因爲這將不再允許您訪問您在/ web-app/js /中的JavaScript文件。所有的JavaScript文件都必須移動到控制器指向的目錄中。

我會使用類似

"/dynjs/$action"

這樣你仍然可以指向同出衝突/ web應用/ JS /文件檔案,享受GSP標籤的典型應用該類超支的JavaScript文件

如果我錯了,請糾正我。

1

如果您想使用控制器的Javascript代碼(其中引用您打算使用Groovy代碼的JavaScript呈現的HTML頁面)創建的模型,那麼你就可以使用這種技術:

這種技術不需要更改URL映射,也不需要您創建額外的控制器。

在您看來普惠制添加JavaScript如下:

<script type="text/javascript"> 
     <g:render template="/javascript/yourJavascriptFile"/> 
    </script> 

在視圖文件夾中創建一個 「JavaScript的」 文件夾中。並創建一個名爲: _yourJavascriptFile.gsp

您不僅可以在_yourJavascriptFile.gsp文件中使用所有GSP代碼,還可以使用在控制器中創建的所有模型(即渲染視圖)。

注意:JavaScript文件夾沒有什麼特別之處。您可以將其命名爲任何您想要的名稱或使用現有的視圖文件夾。這只是一個組織和識別JavaScript Spitting GSP的HTML Spitting GSP的問題。另外,您也可以使用一些命名約定,如:_something.js.gsp等

1

名稱腳本這樣

/wherever/the/js/files/are/thescript.js.gsp 

內的GSP代碼將正確地Grails的呈現。這是有效的,但我不知道它是否被認爲是好主意。