玩框架:在单独的JavaScript文件中使用URL的最佳实践?

玩框架:在单独的JavaScript文件中使用URL的最佳实践?,javascript,frameworks,external,playframework,Javascript,Frameworks,External,Playframework,我正在改编一部戏剧!有很多JS的项目 HTML模板文件中的代码。此代码应移到外部 JS文件具有更好的可读性和更快的页面加载时间。然而, 当我在公用文件夹中创建一个JS文件时,所有 @{Controller.method}链接替换不再工作。我是 考虑从HTML调用一些初始化函数 只提供所需URL的模板,如 initialize({ "Application.doThis" : "@{Application.doThis}"}) 然而,这对于任何URL来说都变得非常麻烦和容易出错 这是补充的。另一

我正在改编一部戏剧!有很多JS的项目 HTML模板文件中的代码。此代码应移到外部 JS文件具有更好的可读性和更快的页面加载时间。然而, 当我在公用文件夹中创建一个JS文件时,所有 @{Controller.method}链接替换不再工作。我是 考虑从HTML调用一些初始化函数 只提供所需URL的模板,如

initialize({ "Application.doThis" : "@{Application.doThis}"})
然而,这对于任何URL来说都变得非常麻烦和容易出错 这是补充的。另一件事是,I18N也不再工作。所以 对于这样的场景,最佳实践是什么 JS代码位于单独的文件中,但仍希望使用URL生成和
I18N在JS中?

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

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

诀窍是让框架解析javascript、CSS或静态目录中的任何其他内容。这里有一个简单的解决方案

添加
控制器。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
它的工作原理与
{script/}
标记完全相同,但在返回文件之前先解析文件:
{parsescript'test.js'/}

同样可以无耻地破解
{stylesheet/}
标记,但我认为我已经占用了足够的空间



谢谢。这就是我的想法,然而这实际上意味着我必须使用很多样板代码,每当出现新的路由时,我必须扩展这些样板代码,这很容易被忘记。另一件事是在JavaScript中使用i18n作为消息,当然也可以为消息编写这样的“路由器”,但这实际上复制了JavaScript中的所有i18n键。我想我们可以提供一个标签,通过javascript公开整个路由文件,但这可能会导致安全问题。
GET  /parse/{<.*>route} StaticParser.parse
<script src="/parse/public/javascripts/test.js"
   language="javascript" type="text/javascript" ></script>
{
 *  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>