1) Полная документация на русском, покрытие юнит-тестами
2) Привычная работа с JSON в dot-нотации и легкий доступ к данным.
Т.е получение значения var settings = model('user.data.settings');
равнозначно записи в чистом JS var settings = user && user.data && user.data.settings !== undefined ? user.data.settings : null;
Вам больше не нужно заботится о проверке всех частей цепочки доступа к данным.
3) Малый вес библиотеки (~20 кб в минимизированном виде, в gzip будет совсем копейки).
Для сравнения вес других библиотек, решающих похожие задачи:
- Ember.js — ~150Кб
- Backbone.js — ~17Кб (без учета Underscore)
- Knockout.js — ~42Кб
4) Используйте свой любимый фреймворк для работы с DOM и шаблонизатор (я рекомендую jQuery + JSrender)
5) Отказ от захламления логикой в data-аттрибутах (пример из knockout: data-bind="value: myData()"
)
Связь с DOM-элементами по-прежнему через data-аттрибут (data-follow="my.data.here"
), который содержит лишь цепочку (путь к данным в модели, который можно рассматривать как уникальный идентификатор).
Логика и всё поведение хранится в JS:
- При обновлении данных приложения со стороны модели — триггеры через
model.follow(chain, callback, [mode])
- При обновлении DOM-элементов (обычно это элементы формы) — триггеры через
Follow.link({match: 'selector', trigger: function(){}})
6) Все данные в модели явлются наблюдаемыми (observable). Можно оформить подписку на изменение одного или множества «цепочек» в модели.
К примеру, в knockoutjs чтобы создать лишь одну наблюдаемую переменную в модели используется ko.observable('default-value')
.
Создавая Follow.js, хотелось максимально следовать лозунгу jQuery — «write less, do more». Из этого вытекает пункт 7.
7) JavaScript очень гибкий язык с точки зрения синтаксиса и не пользоваться этим было бы глупо.
Именно поэтому при получении экземпляра модели нету необходимости писать new Follow
.
Именно поэтому конструктор Follow возвращает объект модели (model) в виде функции, которая упрощает работу сразу с 3 вещами:
- Получение данных (Getter) — вместо
model.get('chain')
пишем сразуmodel('chain')
- Присвоение данных (Setter) — вместо
model.set('chain', 'new-data')
пишемmodel('chain', 'new-data')
- Поскольку экземпляр модели — функция, мы можем изменить поведение этого объекта в контексте строки, т.е перегружаем метод
toString()
, поэтомуalert(model)
возвратит нам строковое представление модели (прозрачный вызовmodel.toJSON
)
Конечно, подозреваю, многим традиционалистам ООП не понравится это якобы, сомнительное улучшение.
8) Простая интеграция с другими библиотеками и back-end частью вашего сервиса благодаря JSON-модели данных.
В любой момент работы приложения получаете текущее состостояние модели через model.toJSON([chain])
и отсылаете на сервер.
9) В любом паттерне при работе с данными, типа MVC иили MVVM, главная её часть — это работа с моделью.
Именно поэтому в Follow.js всё внимание уделено работе с моделью. Шаблонизация данных или работа с DOM не её забота.
Когда каждый инструмент решает свою задачу и при этом сочетается с другими это прекрасно.
10) Готовая интеграция «из коробки» с проектами, работающими на XSL/XML. Принцип работы предельно прост:
- В любом месте XML-документа формируете специально оформленные мапперы для сборки данных (XML)
- В XSL-документе вызываете шаблон, который обработает мапперы, сформирует JSON и прокинет данные на клиент (JS)
Исходники на GitHub
Документация
Автор: extensible