Частичный рендеринг при вызове AJAX в Play Framework

Я видел здесь несколько похожих вопросов, но ни один из них не помог решить мою проблему.

У меня есть таблица на странице и кнопка, которая должна перерисовывать таблицу при нажатии (с использованием разных параметров разбиения на страницы, сортировки и т. д.).

Я попробовал несколько подходов, и мне удалось передать значения контроллеру со встроенным маршрутизатором js, но, поскольку значения передаются на сервер с помощью вызова ajax, я не могу повторно отобразить таблицу.

Мой встроенный маршрутизатор выглядит так:

@helper.javascriptRouter("jsRoutes")(
    routes.javascript.UserController.getUsers
)

И я буду вызывать его со страницы примерно так: $.ajax(jsRoutes.controllers.UserController.getUsers(3, true, "login"));

Теперь, последнее, но не менее важное, я хочу перерисовать таблицу с результатом вызова getUsers().

Просто вызов:

public Result getUsers(int size, boolean isAsc, String sortBy) {
    ......
    Logger.info("Returning " + size + " users");
    return Results.ok(usersPage.render(userDtos));
}

не работает для меня.


person yuranos    schedule 19.01.2015    source источник


Ответы (1)


Есть несколько подходов.

Самое простое — иметь контроллер воспроизведения, который отображает таблицу в HTML, а затем загружает ее на свою страницу с помощью $('# mytable').load(...).

Более гибким является наличие контроллера воспроизведения, который возвращает данные в формате JSON, а затем преобразует их. в HTML в браузере. Это можно сделать вручную с помощью механизма шаблонов на стороне клиента (например, http://handlebarsjs.com/). или используя полную структуру javascript (например, AngularJS или Ember.js).

person user2595529    schedule 19.01.2015
comment
Спасибо за ваш ответ. Можно поподробнее о втором подходе? Возврат HTML для меня не вариант. Что касается шаблонов, я бы предпочел использовать встроенный механизм шаблонов Twirl, но это не моя главная задача. Можете ли вы привести пример того, как вы будете отображать HTML-клиент вручную, когда действие вызывается с помощью ajax? - person yuranos; 19.01.2015
comment
Почему вы не можете вернуть HTML? На самом деле это просто фрагмент HTML (таблица в вашем случае), этот фрагмент обновляет узел DOM. У вас нет полного обновления страницы. Подход JSON подразумевает рендеринг HTML в JavaScript, вы не можете сделать это с Twirl. - person user2595529; 19.01.2015
comment
Вот два примера ручного рендеринга на стороне клиента: jsfiddle.net/mjaric/sEwM6 и stackoverflow.com/questions/21184733/render-json-into-html Если ваша таблица сложна, вам действительно следует использовать механизм шаблонов или полную структуру. - person user2595529; 19.01.2015
comment
Я не хочу возвращать HTML-фрагмент, потому что в моем случае он может быть довольно большим (в таблице есть кнопка «Дополнительно», которая расширяет ее вниз, поэтому мы можем говорить о сотнях строк). Более того, я не знаю, поможет ли это, потому что какая разница, какой контент я пытаюсь отобразить? Проблема в том, что ничего не перерисовывается, хотя данные, отправленные в метод render(), обновляются. Все это было очень легко сделать в JSF, например, используя регион. Я новичок в Play, но уверен, что должен быть какой-то простой механизм для частичного повторного рендеринга. Это требование просто вездесущее в наше время. - person yuranos; 19.01.2015
comment
JSF — это старая школа. Как вы думаете, что происходит при частичном рендеринге? Вызов ajax происходит за сценой, и js на стороне клиента JSF заменяет возвращенный html. В игре нет лишних абстракций, под которыми скрывается главное, что происходит. Вы делаете это своей рукой. - person vumaasha; 20.01.2015
comment
Почему вы предпочитаете Play Framework вместо JSF? JSF — это компонентно-ориентированный фреймворк, а Play Framework ориентирован на запросы. У них очень разные сладости. Также см. en.wikipedia.org/wiki/. - person user2595529; 21.01.2015
comment
Я хотел поэкспериментировать с веб-фреймворком без Servlet API, и, кроме того, мы широко используем Akka, а поскольку Play также основан на Akka, очень удобно склеивать разные бэкэнд-компоненты вместе, используя реактивный подход. - person yuranos; 04.02.2015