7

Grails で JavaScript 関数を定義する場所は基本的に 2 つあります。GSP の要素で直接定義する場所と、/web-app/js の下の別の JavaScript ソース ファイル (たとえば、application.js) 内です。application.js 内で一般的に再利用される JavaScript 関数を定義しましたが、関数の一部を Groovy コードを使用して動的に生成できるようにする必要もあります。残念ながら、${some groovy code} は別の JavaScript ソース ファイル内で処理されていないようです。

GSP ページの script タグ内で javascript 関数を定義することによってこれを行う唯一の方法ですか、それともより一般的な解決策がありますか? もちろん、再利用されるテンプレート GSP ファイル内のスクリプト タグで JavaScript 関数を定義することもできますが、JavaScript 関数を 1 か所 (つまり、外部 JavaScript ソース ファイル) でまとめて定義しておくことを強く求められています。これにはパフォーマンス上の利点もあります (クライアントがアクセスするすべての HTML ページのソース内で同じ JavaScript 関数を再ロードするのではなく、JavaScript ソース ファイルは通常、各クライアントのブラウザーによって 1 回だけダウンロードされます)。関数を静的部分と動的部分に分割し、静的部分を外部ソースに配置し、動的部分をテンプレート GSP に配置してから、それらを接着するというアイデアをいじりました。

何か案は?

(編集: JavaScript 関数の一部を動的に生成し、一度ダウンロードしてクライアントが何度も使用するという考えは悪い考えのように聞こえるかもしれません。しかし、「動的」な部分は変化するだけです。おそらく週または月に 1 回、その後はごくわずかです. ほとんどの場合、ハードコーディングするのではなく、1 回だけでも、データベースからこの部分を生成したいだけです.)

4

6 に答える 6

13

UrlMappings.groovyJavaScript を邪魔にならないようにするための簡単な解決策は、JavaScriptController を作成し、これをファイルに追加してそのアクション "/js/*" をマップすることです。

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

次に、必要な動的 JS ファイルごとにアクションを作成し、レイアウト <HEAD> に含めるだけで、Grails スニペットを挿入できる JS ファイルができあがります! :)

注:現在、Grails にはファイル拡張子をコンテンツ タイプに適切にマップしないバグがあることがわかったので<%@ page contentType="text/javascript; UTF-8" %>、ビュー ファイルの先頭に含める必要があります。

于 2009-01-08T20:03:15.173 に答える
7

これは素晴らしい解決策です。のマッピング以外のものを使用することを提案したいと思います

「/js/$アクション」
これにより、/web-app/js/ 内の JavaScript ファイルにアクセスできなくなるためです。すべての JavaScript ファイルは、コントローラが指すディレクトリに移動する必要があります。

私は次のようなものを使用します

「/dynjs/$アクション」

このようにして、競合することなく /web-app/js/ ファイル内のファイルを指し示すことができ、javascript ファイル内の gsp タグの利点を享受できます。

私が間違っている場合は、私を修正してください。

于 2009-05-15T18:59:11.367 に答える
1

スクリプトに次のような名前を付けます

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

内部の gsp コードは、grails によって正しくレンダリングされます。これは機能しますが、それが良いアイデアと見なされるかどうかはわかりません。

于 2011-02-15T19:56:32.137 に答える
1

または、これ...タグ/サービス/動的メソッドを使用して、タグがJS + CSS +その他のものを、別のコントローラーによってJS + CSSリソースを構築するために使用される「キャッシュ」に書き出すことができます。

完全な概念はこちら: [ http://www.anyware.co.uk/2005/2009/01/19/an-idea-to-give-grails-tags-esp/][1]

于 2009-01-22T15:23:09.893 に答える
1

コントローラーによって作成されたモデル (Groovy コードを使用する予定の Javascript を参照する HTML ページをレンダリングしたモデル) を Javascript コードで使用する場合は、次の手法を使用できます。

この手法では、URL マッピングを変更する必要はなく、追加のコントローラーを作成する必要もありません。

ビュー GSP で、次のように JavaScript を追加します。

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

ビューフォルダーに「javascript」フォルダーを作成します。_yourJavascriptFile.gsp という名前のファイルを作成します。

_yourJavascriptFile.gsp ファイル内のすべての GSP コードを使用できるだけでなく、コントローラーで作成された (ビューをレンダリングしている) すべてのモデルを使用することもできます。

注: javascript フォルダーについて特別なことは何もありません。任意の名前を付けるか、既存のビュー フォルダーを使用できます。これは、Javascript スピッティング GSP から HTML スピッティング GSP を整理して識別するだけの問題です。または、_something.js.gsp などの命名規則を使用することもできます。

于 2011-01-14T18:33:00.117 に答える
0

別の方法があります-生成されたコードをクロージャを期待する関数に渡します。もちろん、これらのクロージャはプログラムによって生成されます。生成されたコードはもちろん、gspページでインライン化/スクリプトタグ付けされます。

生成されるコードの性質に応じて、機能する場合と機能しない場合があります。しかし、うまくいくと思います。うまくいかない場合は、JavaScriptのコーディングスタイルを少し調整するだけで間違いなく機能します。ただし、これらの「生成された」コードがあまり変わらない場合、これは非常にやり過ぎのimoです。

于 2009-01-09T16:25:46.977 に答える