遊びます!フレームワーク:別のJavaScriptファイルのURLを使用するためのベストプラクティス?

StackOverflow https://stackoverflow.com/questions/4209420

質問

私は現在プレイを再編成しています! JSの多くをそこにあるプロジェクト HTMLテンプレートファイル内のコード。このコードは、外部に移動する必要があります 読みやすく、より速くページの読み込み時間のためのJSファイル。しかしながら、 私は、パブリックフォルダ内のJSファイルを作成するときに、すべての @ {} Controller.methodリンクの交換は、もはや機能していません。 Iました HTMLからいくつかの初期化関数を呼び出すことを考えます ただ

のように必要なURLを提供するテンプレート
initialize({ "Application.doThis" : "@{Application.doThis}"})
しかし、これは非常に面倒でエラーが発生しやすい任意のURLとなりつつあります それが追加されます。もう一つは、I18Nも、もはや機能していること、ではありません。そう あなたの持っているこのようなシナリオのためのベストプラクティスは何ですか JSコード別のファイルにまだURLの生成を使用したいと あなたのJSでのI18N?

役に立ちましたか?

解決

メインテンプレートでは、 'Javascriptのルータ' を生成、何かます:

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

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

$.get(routes.doThis({param1: x, param2: 'yop'}))

他のヒント

トリックは、あなたの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 /}タグをハック可能性がありますが、私は、私はすでに十分なスペースを取ったと思う。

<時間>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top