Знакомство с knockout.js (часть 1/3)
В красном углу у нас JavaScript библиотека knockout.js весом 29Kb (не сжатая), которая используется для создания динамических пользовательских интерфейсов. Её можно совмещать с любой существующей библиотекой, но лучше всего она работает с jQuery, и в качестве системы шаблонов использует jQuery.tmpl.
Knockout - это не замена jQuery; я сам являюсь ярым поклонником данной библиотеки. Однако сложно создавать комплексные пользовательские интерфейсы с помощью одной jQuery. Одно дело просто создать хороший интерфейс, другое дело - оживить его, сделать динамичным, включить возможность сортировки данных и многое другое.
В этом уроке мы создадим пользовательский интерфейс, содержащий список контактов, который мы в последствии сможем фильтровать и сортировать. Knockout.js будет играть роль посредника между данными и страницей, таким образом, облегчив нам работу над UI.
Раунд 1. Начало
Knockout использует архитектуру (MVVM) Модель - Представление - Модель представления. Список контактов и прочие элементы страницы, из которых она будет состоять, могут быть помещены в представление. Сами данные, которые будут отображаться, могут быть представлены в модели. Третий компонент, модель представления, - это по сути состояние интерфейса в данный момент времени (комбинация данных и представления с уже применёнными интерактивными элементами).
Давайте же начнём работу с создания каталогов. В первую очередь, создайте папку knockout, а в ней - три каталога: css, img, js. В папке css будут храниться стили, которые мы будем использовать в нашем интерфейсе, в img изображения, в js скрипты. Для начала, в папку js нужно закинуть три следующих файла:
Теперь создаём страницу и подключаем файлы:
<!DOCTYPE html> <html> <head> <title>Knockout</title> <link rel="stylesheet" href="/css/styles.css" /> </head> <body> <script src="/js/jquery-1.9.1.min.js"></script> <script src="/js/jquery.tmpl.min.js"></script> <script src="/js/knockout-2.2.1.js"></script> <script src="/js/behavior.js"></script> </body> </html>
Сохраняем данный файл как index.html в корневой папке knockout. Этот код представляет из себя документ HTML5. Knockout, конечно же, работает и с другими версиями, но в данной серии уроков мы будем использовать специальные атрибуты, которых нет в HTML4.01. Я имею в виду атрибуты с префиксом data-*.
Также в нашем примере мы будем использовать таблицу стилей. Поскольку это не урок по CSS, то я не буду представлять этот код. Вы всё сможете найти в исходниках.
Основной скрипт
Далее нам необходимо создать js файл, где будет располагаться основной функционал. Давайте создадим файл behavior.js и поместим в него следующий код:
(function ($) { var model = [{ name: "John", address: "1, a road, a town, a county, a postcode", tel: "1234567890", site: "www.ruseller.com", pic: "/img/john.jpg", deleteMe: function () { viewModel.people.remove(this); } }, { name: "Jane", address: "2, a street, a city, a county, a postcode", tel: "1234567890", site: "www.ruseller.com", pic: "/img/jane.jpg", deleteMe: function () { viewModel.people.remove(this); } }, { name: "Fred", address: "3, an avenue, a village, a county, a postcode", tel: "1234567890", site: "www.ruseller.com", pic: "/img/fred.jpg", deleteMe: function () { viewModel.people.remove(this); } }, { name: "Freda", address: "4, a street, a suburb, a county, a postcode", tel: "1234567890", site: "www.ruseller.com", pic: "/img/jane.jpg", deleteMe: function () { viewModel.people.remove(this); } }], viewModel = { people: ko.observableArray(model)}; ko.applyBindings(viewModel); })(jQuery);
Сохраняем файл. В этом коде мы определяем функцию, куда в первую очередь, передаём объект jQuery, для того чтобы сделать алиас знака $.
Затем определяем объект модели. В этом примере данные модели будут представлены в виде обычного массива, однако никто не мешает вам в дальнейшем получить их в таком же виде из какого-то веб сервиса. Наш массив содержит набор объектов, структура которых сходна с таблицей contacts в нашей предполагаемой БД. Помимо текстовых полей, каждый из объектов хранит метод deleteMe, который предназначен для удаления объекта из модели.
Модель представления, как уже упоминалось ранее, содержит данные, отображаемые в текущий момент времени. Поэтому после создания модели мы, с помощью метода ko.observableArray(), помещаем данные массива в модель представления. Методы наблюдатели (observable*) - это фундаментальное понятие в knockout.js;
После создания объекта модели представления мы поставили запятую, после которой, в дальнейшем, запишем остальные настройки.
После всего этого мы используем метод ko.applyBindings(), для того чтобы иметь возможность работать с моделью представления. Также данные метод применяет специальные привязки данных, которые у нас ещё не определены. Сделаем это в дальнейшем.
Раунд 2. Создание представления
Теперь, когда у нас есть модель и модель представления, можем заняться созданием файла, где будет осуществляться ввод, подстановка и вывод данных. Knockout очень просто интегрируется с jQuery плагином tmpl. Добавьте следующий код в блок div перед подключением js файлов:
<div id="people" data-bind="template: { name: 'personTemplate', foreach: people }"> </div> <script id="personTemplate" type="text/x-jquery-tmpl"> <section class="person"> <img src="/img/person.png" alt="${ name }" /> <h1>${ name }</h1> <address>${ address }</address> <span class="tel">${ tel }</span> <a href="http://${ site }" title="Visit site">${ site }</a> <div class="tools"> <button data-bind="click: deleteMe">Delete</button> </div> </section> </script>
В первую очередь, мы добавляем пустой div с id=”people”. Обратите внимание, что к данному элементу мы присоединили атрибут -data-bind. Данный атрибут сообщит knockout.js, какие данные должны быть привязаны к этому элементу. При вызове метода ko.applyBindings() как раз-таки и происходит эта привязка, о которой я говорил вам раньше. Также в этом атрибуте мы указываем название шаблона, в котором будут выводиться данные.
Также мы пишем настройку foreach, указывая название объекта, где хранятся наши данные. Конечно же мы можем воспользоваться специальным блоком {{each}} для прохождения по массиву, однако лучше привыкать к knockout-записям. Поскольку при конфигурации модели мы воспользовались методом-наблюдателем observableArray, knockout.js сможет отследить изменение массива объектов и сразу же обновить их отображение на странице. Ещё одно преимущество использования настройки foreach: при изменении модели только новая или изменённая запись будет пропущена через шаблон и выведена на экран. При использовании стандартной шаблонной записи {{each}} данная процедура затронет все записи в модели.
Сразу после определения div следует создание шаблона. Тут мы указываем, какие данные необходимо будет выводить при каждой итерации цикла. В качестве контейнера выбираем элемент <select>, который будет создаваться для каждого элемента модели. А теперь очень важный момент: привязка сгенерированного блока к данным модели. Тут мы будем отслеживать клик по кнопке delete и в случае, если это произойдёт, вызовем метод deleteMe соответствующего объекта.
В результате выполнения нашего кода страница должна выглядеть следующим образом:
Круто, не правда ли?
Раунд 3. Добавление данных
Теперь, когда у нас есть возможность удалять данные, пришло время написать функционал добавления записей. Вставляем следующий код в уже существующий пустой div.
<div id="new"> <a href="#" title="Add new person" data-bind="click: showForm, visible: displayButton">Add person</a> <fieldset data-bind="visible: displayForm"> <div class="details"> <label>Name: <input id="name" /></label> <label>Address: <input id="address" /></label> <label>Tel: <input id="tel" /></label> <label>Site: <input id="site" /></label> </div> <div class="img"> <label>Picture: <input id="pic" type="file" /></label> </div> <div class="tools"> <button data-bind="click: addPerson">Add</button> <button data-bind="click: hideForm">Cancel</button> </div> </fieldset> <div>
Самый первый элемент ссылки предназначен для раскрытия формы добавления новой записи. Тут всё будет работать практически так, как если бы мы это делали на jQuery, но только с одним отличием - нам нужно будет при клике привязать специальное событие. Для привязки нашего события к модели представления нам нужно просто указать имя метода обработчика.
Также, прошу обратить внимание на опцию visible: displayButton. Название displayButton будет сконфигурировано в модели представления и отвечать за видимость данного элемента ссылки.
После этого, в контейнере <fieldset> мы перечисляем нужные поля для нового пользователя. В конце добавляем две кнопки для добавления новой записи и для закрытия формы. К обоим кнопкам будут привязаны события addPerson и hideForm.
Теперь давайте посмотрим на JavaScript код. Добавить его нужно после запятой в объекте viewModel
displayButton: ko.observable(true), displayForm: ko.observable(false), showForm: function () { viewModel.displayForm(true).displayButton(false); }, hideForm: function () { viewModel.displayForm(false).displayButton(true); }, addPerson: function () { viewModel.displayForm(false). displayButton(true). people.push({ name: $("#name").val(), address: $("#address").val(), tel: $("#tel").val(), site: $("#site").val(), pic: "", deleteMe: function () { viewModel.people.remove(this); } }); }
В первую очередь, объявляем свойство displayButton, которое будет нам доступно из html. Мы его используем в элементе ссылки. Запись ko.observable(true) означает, что данный элемент будет видимым при загрузки страницы.
Со свойством displayForm почти что то же самое. Только в отличие от предыдущего, элемент с данной настройкой (форма добавления записи) будет невидимой.
После этого мы реализуем три метода: showForm - вывод формы добавления; hideForm - закрытие формы добавления; addPerson - добавление нового пользователя.
Для обновления массива people мы можем использовать JSON сериализатор, чтобы преобразовать массив в JSON объект. Это нужно делать в том случае, если мы будем отправлять новые данные на вставку в базу. В нашем тестовом примере можем просто вывести это значение в консоль.
console.log(ko.toJSON(viewModel.people));
Результат боя
В этом уроке мы связали данные в модели с HTML представлением. При всём при этом, функционал отслеживает изменения данных и, соответственно, их отображение. Если данные изменились, то написанный нами скрипт, автоматически обновит их в HTML коде.
Knockout.js - это очень полезный посредник между источником данных и их представлением на странице. Он делает за нас кучу работы, но на самом деле, это только вершина айсберга. Дальше будет больше. Что вы думаете о knockout.js?
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/YIjO76vCZ-k/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей Индийская пословица |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.