0

我在 Play 2.1.x 应用程序中使用 jsRoutes。我的部分路由文件如下所示:

GET    /assets/template/js/routes/admin.js           controllers.Admin.jsRoutes
GET    /assets/template/js/routes/salonManagement.js controllers.SalonManagement.jsRoutes

而且我想在我的 scala 模板中使用这两个引用(也就是说,按照设计,一个控制器包含必要的 api 函数,另一个包含必要的表单提交 url)。所以在我的 scala 模板中,我有以下部分:

<script type="text/javascript" src="@routes.Admin.jsRoutes()"></script>
<script type="text/javascript" src="@routes.SalonManagement.jsRoutes()"></script>

不幸的是,每个生成的 javascript 文件都以var jsRoutes = {};. 因此,@routes.SalonManagement.jsRoutes()覆盖的属性,@routes.Admin.jsRoutes()我只能使用最后一个 jsRoutes 对象。

现在,我只知道一种解决方法。在每个 jsRoutes 声明之后,我可以插入一个脚本,将旧的 jsRoutes 对象复制到一个临时对象,然后用它自己扩展新的 jsRoutes。但这看起来不是正确的方法。

没有更好的办法吗?

4

2 回答 2

3

“jsRoutes”这个名字没有什么特别之处。您可以保持相同的方法名称以保持各种控制器之间的一致性,但只需将不同的名称传递给Routes.javascriptRouter方法。

于 2013-10-18T16:14:16.213 回答
0

把它放在你的模板中。我把它放在一个包含其他页面的主模板中。

<script src="@controllers.routes.Application.jsRoutes()" type="text/javascript"></script> 

并将其放入您的路线文件中

#jsroutes for ajax calls
GET     /assets/js/routes           controllers.Application.jsRoutes()

然后在您的应用程序控制器中,通过实现此方法来引用您想要的任何控制器中的任何方法

public Result jsRoutes()
{
    response().setContentType("text/javascript");
    return ok(Routes.javascriptRouter("jsRoutes", 
              routes.javascript.Signup.forgotPassword(),
              routes.javascript.Customers.findByName(),
              routes.javascript.Customers.findByNumber()
              ));
}

这些对应于像这样的路线

GET     /customerfind/:name            controllers.Customers.findByName(name: String)

请注意,在 jsroutes 方法中配置的调用不需要包含参数。将所有这些都放在一个地方,即应用程序控制器,只要它引用在相应控制器中实现的方法,它似乎是合理的。就像在这个例子中一样,对客户的查找位于客户控制器中。此外,只需检查一个控制器(应用程序)以查看通过 javascript 路由可用于 ajax 调用的所有方法,这有点好。

于 2016-04-16T22:36:30.860 回答