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.

Другие вопросы по тегам