Хитрость заключается в том чтобы получить структуру для анализа вашего 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
Регулярное выражение в том, что маршрут очень важно, в противном случае вы не можете добавить Pathing к запросу. Чтобы запросить разобранный статический ресурс, такие как 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 /}
тег, но я думаю, что я принял уже достаточно пространства.
спасибо. Это было то, что я имел в виду, однако на самом деле это означает, что у меня есть много кода шаблона, который я должен распространять каждый раз, когда появляется новый маршрут, который легко забывается. Другое дело - использовать i18n для сообщений внутри JavaScript, можно, конечно, написать такой «роутер» для сообщений, но это эффективно дублирует все ключи I18N в JavaScript. –
Вы уже можете использовать тег # {18n /}. Я думаю, мы могли бы предоставить тег, который выставляет весь файл маршрута через javascript, но это может привести к проблемам безопасности. –
Хорошо, спасибо вам большое! –