HTML 5: PagedList на knockout.js или как разбить данные на страницы через AJAX
Сайтостроение | создано: 12.02.2013 | опубликовано: 12.02.2013 | обновлено: 13.01.2024 | просмотров: 7646
Knockout.js очень мощный инструмент для разработки приложений под HTML 5. На этот раз будем делать пейджер. Как оказалось, задача не совсем тривиальная. Смотрите сами.
Постановка задачи
Требуется получение данных в формате JSON. Данные должны быть разбиты на страницы, размер страниц можно устанавливать, страницы можно переключать (а иначе зачем всё это). А также требуется возможность поиска (фильтрации).
Давайте для начала подготовим к работе вновь созданный проект. Для этого выполним операции, которые были уже не раз описаны в предыдущих статьях.
Подготовка
Первое: в Package Maganger Console:
- Обновим все Nuget-пакеты, которые встроены в шаблон MVC4.
- Установим новый пакет JsSite – библиотека Java-скриптов.
- Еще один пакет SampleData, содержит тестовые данные (чтобы было с чем работать, описание пакета и его создание уже было описано ранее)
Второе: в главном шаблоне приложения _Layout.cshtml добавим ссылки на скрипты, которые добавились в систему вместе с JsSite.
@{
ViewBag.Title = "Home Page";
}
<h1 data-bind="text: meta.title"></h1>
<div id="clock" data-bind="text: clock.time"></div>
<p data-bind="text: meta.description"></p>
<p>
page size: <span data-bind="text: people().length"></span>
<br />
total items: <span data-bind="text: ds.queryParams.total"></span>
<br />
current page index: <span data-bind="text: ds.queryParams.index"></span>
<br />
groupSize: <span data-bind="text: ds.queryParams.groupSize"></span>
<br />
</p>
<div data-bind="blockUI: indicator">
<div>
<input type="text" name="name"
data-bind="value: ds.queryParams.query, valueUpdate:'keyup'" />
</div>
<div data-bind="pager: pager"></div>
<table>
<thead>
<tr>
<th>Имя</th>
<th>Возраст</th>
<th>Профессия</th>
<th>В партии</th>
<th>Пол</th>
</tr>
</thead>
<tbody>
<!-- ko foreach: people -->
<tr>
<td>
<span data-bind="text: Name"></span>
</td>
<td>
<span data-bind="text: Age"></span>
</td>
<td>
<span data-bind="text: Description"></span>
</td>
<td>
<span data-bind="date: MemberDate"></span>
</td>
<td>
<span data-bind="text: Gender"></span>
</td>
</tr>
<!-- /ko -->
</tbody>
</table>
</div>
@section scripts
{
<script src="~/Scripts/app/site.vm.homeIndex.js"></script>
}
@*<pre>
<span data-bind="text: JSON.stringify(ko.toJS($data),null,2)"></span>
</pre>*@
В качестве заключения
В предыдущем листинге, в строке 25 вы уже заметили, binding типа Pager, именно так осуществляется привязка site.controls.Pager() на форме (в разметке). Данная реализация пейджера очень проста, потому что малова-то кнопок навигации, но это уже дело техники.
Вся магия привязки лежит в Knockout, а конкретно в файле site.bindingHandlers.js,который устанавливается с пакетом JsSite, я написал ko.bindingHandlers.pager, который и выводит страницы от site.controls.Pager.
Кстати, вместе с пакетом JsSite появляется файл content/site.pager.css со стилями для пейджера и картинка-анимация images/ms-loader.gif.