Play 2.x: Как использовать два файла jsRoutes в одном шаблоне scala
Я использую jsRoutes в своем приложении Play 2.1.x. Часть моего файла маршрутов выглядит следующим образом:
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. Но это не похоже на правильный путь.
Нет ли лучшего способа?
2 ответа
В названии "jsRoutes" нет ничего особенного. Вы можете сохранить одно и то же имя метода для согласованности между различными контроллерами, но просто передать другое имя Routes.javascriptRouter
метод.
Поместите это в свой шаблон. Я положил его в основной шаблон, который оборачивает другие страницы.
<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. Хранение всего этого в одном месте, контроллере приложения, кажется разумным, если речь идет о методах, реализованных в соответствующем контроллере. Как и в этом примере, находка customer находится в контроллере Customers. Также неплохо просто проверить один контроллер (приложение), чтобы увидеть все методы, доступные через маршруты javascript для вызовов ajax.