Jan*_*omä 8 javascript frameworks external playframework
我正在重组Play!项目中HTML模板文件中有很多JS代码.此代码应移至外部JS文件,以提高可读性和加快页面加载速度.但是,当我在公共文件夹中创建一个JS文件时,所有@ {Controller.method}链接替换都不再起作用.我正在考虑从HTML模板调用一些初始化函数,它只提供所需的URL
initialize({ "Application.doThis" : "@{Application.doThis}"})
Run Code Online (Sandbox Code Playgroud)
但是,添加任何URL都会变得非常麻烦且容易出错.另一件事是,I18N也不再适用.那么这些场景的最佳实践是什么,你将JS代码放在一个单独的文件中,但仍想在你的JS中使用URL生成和I18N?
小智 12
在主模板中,生成一个'Javascript路由器',类似于:
<script>
var routes = {
doThis: #{jsAction @Application.doThis(user, ':param1', ':param2') /},
doThat: #{jsAction @doThat() /}
}
</script>
Run Code Online (Sandbox Code Playgroud)
然后在任何"静态"javascript文件中,使用此路由器:
$.get(routes.doThis({param1: x, param2: 'yop'}))
Run Code Online (Sandbox Code Playgroud)
诀窍是让框架解析你的javascript,或你的CSS,或静态目录中的任何其他东西.这是一个简单的解决方案.
添加controllers.StaticParser控制器:
package controllers;
import play.mvc.Controller;
public class StaticParser extends Controller {
public static void parse(String route) {
render("/" + route);
}
}
Run Code Online (Sandbox Code Playgroud)
到你的conf/routes文件添加:
GET /parse/{<.*>route} StaticParser.parse
Run Code Online (Sandbox Code Playgroud)
该路由中的正则表达式非常重要,否则您无法为请求添加路径.要请求解析的静态资源(例如js脚本),请使用:
<script src="/parse/public/javascripts/test.js"
language="javascript" type="text/javascript" ></script>
Run Code Online (Sandbox Code Playgroud)
不幸的是,您无法使用该#{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>
Run Code Online (Sandbox Code Playgroud)
它的工作方式与#{script /}标记完全相同,但在返回之前解析文件:#{parsescript 'test.js' /}
人们可以同样无耻地破解#{stylesheet /}标签,但我认为我已经占用了足够的空间.
| 归档时间: |
|
| 查看次数: |
3834 次 |
| 最近记录: |