Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

yhaskell/simple-data-binding

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

7 Commits

Repository files navigation

Простой data binding

Последняя лабораторная работа

Задача этой лабораторной работы – реализовать механизм, позволяющий делать такое: https://yhaskell.github.io/simple-data-binding/

Data binding

Data binding – механизм, позволяющий "связать" данные модели с интерфейсом пользователя.

Этот механизм широко используется при построении графических интерфейсов: WPF, Angular, Vue.js, и многие другие библиотеки используют data binding.

Data binding разделяют на два типа: one-way и two-way. И тот, и другой вид обеспечивает синхронизацию модели и интерфейса; но одностороннее связывание обеспечивает синхронизацию только в одну сторону (интерфейс по модели, или модель по интерфейсу), в то время как двустороннее связывание, очевидно, делает и то, и другое.

DOM и получение доступа к нему

Document Object Model (DOM) -- это программное представление графического интерфейса web-страницы, не зависящее от языка и платформы. Любой HTML-документ можно представить в виде дерева узлов, где каждому HTML-тэгу соответствует узел в DOM-дереве.

В JavaScript все DOM-элементы являются наследниками класса HTMLElement. Так, элементу <div> соответствует класс HTMLDivElement, элементу <input> соответствует класс HTMLInputElement, и так далее. Более подробно связь тэгов и классов можно посмотреть, к примеру, здесь .

DOM Traversal

DOM Traversal, или "навигация по DOM" – способ поиска конкретных элементов внутри дерева документа.

Корневым элементом DOM-дерева является элемент document, и у него, как и у других элементов DOM-дерева, имеются следующие поля:

  • childNodes – набор детей текущего узла. Включает в себя как элементы, так и текст

  • children – набор детей текущего узла. Включает в себя только элементы (т.е. не текст, а только дочерние тэги)

  • firstChild – первый ребёнок

  • lastChild – последний ребёнок

  • localName – имя тэга. (_Если узел текстовый, то это значение равно #text)

  • parentElement или parentNode – родитель

  • nextSibling и previousSibling – следующий и предыдущий родственник. Включает в себя как элементы (тэги), так и текстовые узлы.

    В случае <p><span>test</span> hello</p> следующим родственником тэга span будет текстовый узел "hello"

  • nextElementSibling и previousElementSibling – аналогично предыдущему, но только для элементов (тэгов).

Ручной поиск элементов – не всегда удобный и быстрый способ найти элемент в дереве. Поэтому в реальном мире часто используются следующие функции:

  • document.getElementById(id) из всего дерева выбирает элемент c соответствующим id;
  • el.querySelector(selector) выбирает из детей элемента el первый элемент, удовлетворяющий CSS-селектору, переданному в качестве параметра.
  • element.querySelectorAll(selector) работает аналогично предыдущей функции, но возвращает массив всех элементов.

CSS-селекторы позволяют из множества элементов более узкое множество. Подробно про них можно прочитать здесь.

Mount – Data Binding Library (наша)

Наша библиотека преставляет интерфейс в виде класса Mount.

Конструктор класса Mount принимает два параметра -- mount (HTMLElement) и initial (object). При инициализации наша библиотека обходит детей элемента mount, и начинает следить за изменениями в тех элементах, в которых есть аргумент data-bind. Параметр initial используется для того, чтобы указать начальное значение модели.

Объекты типа Mount имеют следующие публичные методы:

  • subscribe(fn) принимает параметром функцию с двумя параметрами key, value и добавляет её во внутренний список подписчисков. При изменении модели все подписчики уведомляются об изменениях (key и value содержат ключ и новое значение);
  • set(key, value) устанавливает значение в модели по ключу key;
  • get(key) возвращает значение модели по ключу;
  • toObject() возвращает всю модель как объект (изменения в этом объекте не должны менять модель).

Задание

Реализовать библиотеку, осуществляющую связывание данных для элементов input, select и span (1-way).

Библиотека должна соотвестствовать описанию в предыдущем пункте.

Тестирование

Для тестирования возьмите файл index.html из текущего репозитория и замените mount.min.js своей реализацией.

Дополнительная информация

  • Большинство DOM-объектов для элементов <input> и <select> содержат значение в поле value
  • DOM-объект для флажка (<input type="checkbox">) содержит значение в поле checked
  • DOM-объект для куска текста (<span>) содержит значение в поле innerText
  • Текстовые поля при изменении выполняют событие oninput
  • Флажки, и другие выборные элементы при изменении выполняют событие onchange
  • Для регистрации обработчкиов событий существует функция element.addEventListener

About

Mount - simple data binding library (working example and task for hci students)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /