
Такого рода логика может быть эффективно отделена от DOM, чтобы упростить тестирование и сделать код многократно используемым в различных ситуациях. Это старый MVC , в своем первоначальном воплощении (не на стороне веб-сервера), который теперь можно настроить в браузере.
Задача Backbone.js — настроить небольшую инфраструктуру MVC в окне браузера:
- это обеспечивает структуру для моделей и коллекций .
- Он управляет представлениями, которые заполняются и обновляются с помощью событий, создаваемых моделями.
- Он поддерживает REST-подобные адаптеры для подключения к источнику данных на стороне сервера или localStorage в качестве механизма сохранения .
Pros
Поскольку логика на основе JavaScript будет только расти в современных приложениях, у этого решения есть много плюсов.
Backbone.js стимулирует четкое разделение задач : логика моделей и коллекций представления отделена от шаблонов и обработки событий, генерируемых пользователем.
На самом деле, разделение не является крайним: контроллеры и представления объединяются в одни и те же классы. В этих классах представлений события в определенных элементах DOM связаны с методами, определенными вами для одного и того же объекта:
window.AppView = Backbone.View.extend({
events: {
"keypress #new-todo": "createOnEnter",
"keyup #new-todo": "showTooltip",
"click .todo-clear a": "clearCompleted"
},
...
в то время как методы шаблона вызывают некоторые хуки, которые вы можете определить, чтобы указать HTML для отображения:
render: function() {
this.$('#todo-stats').html(// ...
Более того, многие механизмы (обработка событий, рендеринг HTML, хранение) отнимаются у вас и централизуются платформой .
Cons
Принятие Backbone.js также имеет некоторые ограничения.
Прежде всего, вы должны принять сильную блокировку фреймворка : вы не сможете повторно использовать свой код JavaScript без него. Каждая модель или представление генерируется подпрограммами платформы, начиная с простых старых объектов, содержащих конфигурацию в форме хуков и методов:
window.Todo = Backbone.Model.extend({
defaults: function() {
return {
done: false,
order: Todos.nextOrder()
};
},
toggle: function() {
this.save({done: !this.get("done")});
}
});
В целом мы находимся на уровне архитектуры, соответствующей первому поколению серверных инфраструктур: постоянство на основе Active Record и жесткая зависимость от кода инфраструктуры:
window.TodoList = Backbone.Collection.extend({
model: Todo,
localStorage: new Store("todos"),
...
Например, модели напрямую ссылаются на механизм персистентности (по крайней мере, на коллекцию), чтобы сохранить манипуляции пользователя. Вы не можете протестировать или повторно использовать свой код без Backbone.js и его зависимостей.
Конечно, эта связь присутствует, вероятно, во всех средах JavaScript, более сложных, чем jQuery, и которые нацелены на управление всей цепочкой событий; фреймворк переходит от клика пользователя к запросу на стороне сервера, как в случае с Ext JS. Мы все еще находимся в фазе «сделай все быстро», а не в фазе «умнее работать».
Соединение — это компромисс, который вы делаете с функциональностью, доступной из коробки: такие фреймворки кажутся всесильными, но вы никогда не сможете заменить их в будущем после их принятия.
Ресурсы
Обычно я пишу отдельный пример, когда исследую новый инструмент, но на этот раз уже есть пример, как реальный, так и дидактический.
- Аннотированный источник очень простого приложения , которое хранит список TODO локально в браузере (в HTML5 localStorage).
- Такое же приложение на работе.
- Список всех примеров , которые включают мобильные версии Basecamp (37Signals) и LinkedIn, а также Pandora. BitTorrent даже использовал Backbone для пользовательского интерфейса приложения Win32.
- FAQ .
- Некоторые учебники для начинающих по Backbone, просто чтобы увидеть код из другого источника.