Играть!Framework: Лучшая практика для использования URL-адресов в отдельных файлах JavaScript? - PullRequest
8 голосов
/ 18 ноября 2010

Я сейчас реорганизую игру! проект, где много JS код в файлах шаблона HTML. Этот код следует перенести на внешний JS-файлы для лучшей читаемости и ускорения загрузки страниц. Тем не мение, когда я просто создаю файл JS в общей папке, все @ {Controller.method} замены ссылок больше не работают. я был думать о вызове некоторой функции инициализации из HTML шаблоны, которые просто предоставляют необходимые URL-адреса, такие как

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

однако это становится очень громоздким и подверженным ошибкам с любым URL это добавлено. Другое дело, что I18N тоже больше не работает. Так Какова наилучшая практика для таких сценариев, где у вас есть JS-код в отдельном файле, но все еще хотите использовать генерацию URL и I18N в вашем JS?

Ответы [ 2 ]

12 голосов
/ 18 ноября 2010

В основном шаблоне сгенерируйте «Javascript router», что-то вроде:

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

И затем в любом «статическом» файле javascript используйте этот маршрутизатор:

$.get(routes.doThis({param1: x, param2: 'yop'}))
5 голосов
/ 17 ноября 2011

Хитрость заключается в том, чтобы заставить каркас анализировать ваш 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' /}, потому что тег script ищет статический файл. Чтобы исправить эту утомительную ситуацию, вот бесстыдный взлом тега script: тег #{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 /}, но я думаю, что я уже занял достаточно места.


...