8

我目前正在重组 Play!HTML模板文件中有很多JS代码的项目。应将此代码移至外部 JS 文件,以获得更好的可读性和更快的页面加载时间。但是,当我只是在公共文件夹中创建一个 JS 文件时,所有 @{Controller.method} 链接替换都不再起作用。我正在考虑从 HTML 模板中调用一些初始化函数,它只提供所需的 URL,例如

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

但是,添加任何 URL 都会变得非常麻烦且容易出错。另一件事是,I18N 也不再工作。那么对于这些​​场景的最佳实践是什么,您将 JS 代码放在一个单独的文件中,但仍想在 JS 中使用 URL 生成和 I18N?

4

2 回答 2

12

在主模板中,生成一个“Javascript 路由器”,类似于:

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

然后在任何“静态”javascript文件中,使用这个路由器:

$.get(routes.doThis({param1: x, param2: 'yop'}))
于 2010-11-18T09:25:54.523 回答
5

诀窍是让框架解析您的 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 /}标签,但我想我已经占用了足够的空间。


于 2011-11-17T14:28:36.377 回答