HTML 5: PagedList на knockout.js или как разбить данные на страницы через AJAX
Сайтостроение | создано: 12.02.2013 | опубликовано: 12.02.2013 | обновлено: 13.01.2024 | просмотров: 7443
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.