Sztuką jest uzyskać framework do parsowania twojego javascriptu, twojego CSS lub cokolwiek innego w statycznych katalogach. Oto proste rozwiązanie.
Dodaj controllers.StaticParser
Kontroler:
package controllers;
import play.mvc.Controller;
public class StaticParser extends Controller {
public static void parse(String route) {
render("/" + route);
}
}
do swojej conf/routes
plików dodatek:
GET /parse/{<.*>route} StaticParser.parse
RegExp w tej trasie jest bardzo ważne, w przeciwnym razie nie można dodać pathing do wniosku. Aby zażądać analizowany zasobów statycznych, takich jak skrypt js, użyj:
<script src="/parse/public/javascripts/test.js"
language="javascript" type="text/javascript" ></script>
Niestety, nie można korzystać z formatu #{script 'test.js' /}
, ponieważ tag skrypt szuka pliku statycznego. Aby poprawić tę irytującą-ność, oto bezwstydny hack tagu skryptu: tag #{parsescript 'test.js'/}
. Należy udać się do /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>
To działa dokładnie tak jak tagu #{script /}
, ale analizuje plik przed wpuszczeniem go: #{parsescript 'test.js' /}
Jeden mógłby równie bezwstydnie hack tag #{stylesheet /}
, ale myślę, że już podjęte dostatecznie dużo miejsca.
Dziękuję. To właśnie miałem na myśli, ale to oznacza, że mam dużo kodu, który muszę rozpoczynać za każdym razem, gdy pojawi się nowa trasa, którą łatwo zapomnieć. Inną rzeczą jest używanie i18n dla wiadomości w JavaScript, można oczywiście napisać taki "router" również dla wiadomości, ale to skutecznie powiela wszystkie klucze I18N w JavaScript. –
Możesz już używać znacznika # {18n /}. Sądzę, że możemy dostarczyć znacznik, który eksponuje cały plik trasy przez javascript, ale może to prowadzić do problemów bezpieczeństwa. –
OK, dziękuję bardzo! –