8

現在、Playを再編成しています!HTMLテンプレートファイルにJSコードがたくさんあるプロジェクト。このコードは、読みやすさとページの読み込み時間を短縮するために、外部JSファイルに移動する必要があります。ただし、パブリックフォルダーにJSファイルを作成しただけでは、すべての@{Controller.method}リンクの置換が機能しなくなります。次のような必要なURLを提供するだけのHTMLテンプレートから初期化関数を呼び出すことを考えていました。

initialize({ "Application.doThis" : "@{Application.doThis}"})

ただし、URLを追加すると、これは非常に面倒でエラーが発生しやすくなります。もう1つは、I18Nも機能しなくなったことです。では、JSコードを別のファイルに入れても、JSでURL生成とI18Nを使用したいという、このようなシナリオのベストプラクティスは何でしょうか。

4

2 に答える 2

12

メイン テンプレートで、次のような「Javascript ルーター」を生成します。

<script>
    var routes = {
        doThis: #{jsAction @Application.doThis(user, ':param1', ':param2') /},
        doThat: #{jsAction @doThat() /}
    } 
</script>

そして、任意の「静的」JavaScript ファイルで、次のルーターを使用します。

$.get(routes.doThis({param1: x, param2: 'yop'}))
于 2010-11-18T09:25:54.523 に答える
5

トリックは、フレームワークに JavaScript、CSS、または静的ディレクトリ内のその他のものを解析させることです。これが簡単な解決策です。

controllers.StaticParserコントローラーを追加します。

package controllers;
import play.mvc.Controller;

public class StaticParser extends Controller {
    public static void parse(String route) {
        render("/" + route);
    }
}

conf/routesファイルに次を追加します。

GET  /parse/{<.*>route} StaticParser.parse

そのルートの正規表現は非常に重要です。そうしないと、リクエストにパスを追加できません。js スクリプトなどの解析済み静的リソースをリクエストするには、次を使用します。

<script src="/parse/public/javascripts/test.js"
   language="javascript" type="text/javascript" ></script>

#{script 'test.js' /}残念ながら、スクリプト タグは静的ファイルを検索するため、この形式は使用できません。その煩わしさを正すために、スクリプト タグの恥知らずなハックがあります:#{parsescript 'test.js'/}タグです。次の場所に移動する必要があります/views/tags/parsescript.tag

{
 *  insert a parsescript tag in the template.
 *  by convention, referred script must be put under /public/javascripts
 *    src     (required)   : script filename, without the leading path "/public/javascripts"
 *    id      (opt.)       : sets script id attribute
 *    charset (opt.)       : sets source encoding - defaults to current response encoding
 *
 *    #{parsescript id:'datepicker' , src:'ui/ui.datepicker.js', charset:'${_response_encoding}' /}
}*
%{
    (_arg ) && (_src = _arg);

    if (!_src) {
        throw new play.exceptions.TagInternalException("src attribute cannot be empty for script tag");
    }
    _src = "/public/javascripts/" + _src
    try {
        _abs = play.mvc.Router.reverseWithCheck(_src, play.Play.getVirtualFile(_src), false);
    } catch (Exception ex) {
        throw new play.exceptions.TagInternalException("File not found: " + _src);
    }
}%
<script type="text/javascript" language="javascript"#{if _id} id="${_id}"#{/if}#{if _charset} charset="${_charset}"#{/if}  src="/parse${_abs}"></script>

タグとまったく同じように機能#{script /}しますが、ファイルを返す前に解析します。#{parsescript 'test.js' /}

タグを恥知らずにハッキングすることもでき#{stylesheet /}ますが、すでに十分なスペースを占めていると思います。


于 2011-11-17T14:28:36.377 に答える