0

我在我的Play 2.1.x應用程序中使用jsRoutes。我的路線文件的一部分看上去方式如下:播放2.x:如何在一個scala模板中使用兩個jsRoutes文件

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

而且我想用我的Scala的模板都引用(即設計,一個控制器包含必要的API函數,另外一個必要的表單提交的url) 。 所以在我的斯卡拉模板,我有以下部分:

<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。但這看起來並不是正確的路要走。

沒有更好的方法嗎?

+0

我正在使用Play 2.1.5。 –

回答

2

「jsRoutes」的名字沒什麼特別的。您可以在各種控制器中保持相同方法名稱的一致性,但只需將不同的名稱傳遞給Routes.javascriptRouter方法。

+0

這是一個好方法。謝謝! –

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調用。

相關問題