Scala / Lift: простой пример AJAX- загрузки данных. Lift — современный фреймворк на языке Scala, предназначенный для создания веб- приложений и предлагающий нестандартные подходы для решения некоторых задач. В данной заметке будет рассмотрен простейший пример (до)загрузки данных с сервера при помощи AJAX- запросов. Пост написан в надежде, что он может быть кому- то полезен и сократить время поиска решения на часик- другой, да и просто в качестве демонстрации возможностей отличного современного, но пока не очень популярного фреймворка.
Но я предполагаю, что у читателя уже есть некоторые базовые представления о Lift и о некоторых концепциях, в нем применяемых. В качестве примера возьмем приложение, которое должно отображать «комментарии» — при загрузке страницы первые пять, а загрузку остальных — по запросу, «порциями» по пять штук, без перезагрузки страницы, конечно же. Итак, начнем. Пускай, у нас есть модель Post, представляющая единичный комментарий: class Post extends Long. Keyed. Mapper[Post] with Id. PK {def get. Singleton = Postobject title extends Mapped.
Text(this)object text extends Mapped. Text(this)object date extends Mapped. Date(this)}и соответствующий companion object: object Post extends Post with Long. Keyed. Meta. Mapper[Post] {def get. Posts(start. At: Int, count: Int) = {Post.
1. ОБ УСТРОЙСТВЕ Центральный блок Ajax (далее – центральный блок) – система оscriptserver2.ruанной К примеру, если сработала первая зона, вы получите SMS с установленным Вами текстом.
Серверный обработчик, к которому обращен AJAX -запрос (в примере это с элементарными действиями: добавить в корзину, подписаться, и т.п. Серверный обработчик, к которому обращен AJAX-запрос (в примере это. с элементарными действиями: добавить в корзину, подписаться, и т.п.
При оформлении заказа приходится обновлять страницу чтобы увидеть изменения в цене, постоянные ненужные post-запросы к серверу, все не . Еще один пример удаление из корзины с помощью ajax. При создании магазина часто приходится делать ajax корзину, то что есть в стандарте меня не совсем устраивает.. Ajax корзина. Новый топик. Страницы: 1 2. Кажется на одном из ваших сайтов я видел пример реализации этого (радио пилот, если конечно это на нэткет сделано).
All(Order. By(Post. Descending), Start.
- Компоненты AJAX-приложения. Пример использования JsHttpRequest. AJAX (Asynchronous JavaScript and XML — асинscriptserver2.ruонный JavaScript и XML) — это технология загрузки данных с.
- Нужна корзина, реализованная AJAX (добавление товаров через AJAX). Хороший пример видел на одном из блогов по Javascript, но ссылку не соscriptserver2.ruанил..
At(start. At), Max. Rows(count))}def get.
Posts. Count = Post. В нашем случае можно было обойтись и без этих методов и строить запросы «по- месту» — прямо в коде сниппетов, но, по моему скромному мнению, это затруднит тестирование и перегрузит код. Теперь надо заняться первоначальным отображением комментариев. Для этого создаем следующий сниппет: class Post. Render {def render. Posts(in: Node. Seq): Node.
Seq = {Post. get. Posts(0, 5). flat. Map(item => bind("post", in,"title" - > Text(item.
Text(item. text)))}}И соответствующий embeded- шаблон, который располагается в /templates/__post. Sсala/Lifft иногда бывают нужны): < lift: Post. Render. render. Posts> < p> Title: < post: title /> < br /> < post: text /> < /p> < /lift: Post. Render. render. Posts> и который подключается на требуемой странице с помощью: < div id="posts"> < lift: embed what="/templates/__post" /> < /div> Хочу заметить, что в данном случае я использую «устаревшую» разметку шаблонов, основанную на спец. В результате, после добавления модели в схему БД, заполнения записей и т. Теперь надо организовать загрузку остальных комментариев. AJAX- загрузка. Перед тем, как мы продолжим, стоит несколько слов сказать о Js.
Cmd — фактически, подсистеме в Lift, которая предназначена для генерации клиентского Java. Script на стороне сервера, в коде сниппетов и с последующей вставкой их в ответ. Существуют различные способы инжектирования JS- кода — от метода Js. Raw, позволяющего вставлять «сырой» JS, до прокси- методов для JS- фреймворков.
В первую очередь, Js. Cmd предназначен для реализации небольших по объему частей JS- кода. Модифицируем вставку комментариев, добавив туда вызов сниппета для отображения кнопки загрузки дополнительных объектов: < div id="posts"> < lift: embed what="/templates/__post" /> < /div> < lift: Post. Render. render. Load. More. Control /> и класс сниппета: class Post. Render {val load.
Size = 5val last. Load. Index = Post. Posts. Count - load. Sizevar load. Start. Index = 0def render.
Posts(in: Node. Seq): Node. Seq = {Post. get. Posts(load. Start. Index, load. Size). Map(item => bind("post", in,"title" - > Text(item. Text(item. text)))}def render. Load. More. Control: Node.
Seq = {def load. Posts: Js. Cmd = {load. Start. Index += load. Size. Jq. Js. Cmds. Append. Html("posts", < lift: embed what="/templates/__post" /> ) & {if (last. Load. Index < load.
Start. Index)Js. Cmds. Replace("load. Button", Node. Seq. Empty)}}SHtml. Button("Load More", load. Posts _, "id" - > "load.
Button")}}В класс были введены значения для представления загружаемых «страниц» с комментариями — метод render. Posts использует их первоначальные значения для отображения первых 5 записей, а так же новый метод render. Load. More. Control, который добавляет кнопку для загрузки следующей «порции» комментариев и связывает ее с внутренней функцией load. Posts, которая и представляет собой реализацию AJAX- ответа. Рассмотрим ее подробнее.
Первым делом мы инкрементируем счетчик индекса записей для загрузки — это очевидно. Далее мы вызываем метод Append. Html из пакета net. Jq. Js. Cmds, который предоставляет обертки для функций библиотеки j. Query (которая встроена по- умолчанию в Lift). Append. Html принимает два параметра — id объекта DOM- дерева и объект типа Node.
Seq — собственно, тот код, который и будет добавлен. Думаю, теперь становится понятно, почему шаблон комментария был вынесен в отдельный файл — теперь его можно передать в метод Append. Html в качестве AJAX- ответа, и более того — этот шаблон будет обработан методом render. Posts! Функции, которые возвращают тип Js. Cmd можно конкатенировать с помощью метода & — в нашем случае, при достижении последней «страницы», прячется кнопка загрузки комментариев.
Собственно говоря — это все, весь код На стороне клиента, кнопка превратится в примерно такой код: < button onclick="lift. Ajax. lift_ajax. Handler("F1. RGRLAG=true", null, null, null); return false; " id="load. Button"> Load More< /button> , а код ответа будет содержать команды j. Query, примерно так: j. Query('#'+"posts"). Title: Post #1. 1 ..
В качестве заключения. Конечно же, приведенный пример несколько искусственный, но он может продемонстрировать некоторые особенности Lift: встроенные средства для создания AJAX- запросов, обертки и прокси- методы для создания клиентского Java. Script, сквозная обработка шаблонов. Так же, явно не было написано никакого клиентского JS- кода вовсе — все это берет на себя фреймфорк, за пределы которого мы не выходили в этом примере.
Впрочем, это не единственный подход, и если надо, то конечно же нет никаких препятствий к «ручному управлению». Код приложения можно получить тут (используется Maven). Original source: habrahabr.