SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
Backbone.js	
	




    Обзор
Что	даёт?	
• Наследование	
• Модели	(Models)	
• Коллекции	[Underscore	JS]	
• Представления	(Views)	
• Событийно‑ориентированные	коммуникации	
  (Events)	
• Персистентность	(Sync)	
    – возможность	прозрачного	сохранения	состояния	своих	объектов	в	
      промежутках	времени	между	запусками	программ	

• Маршрутизация	и	HTML5	pushState	
• Потенциальная	возможность	тестирования	
  (Jasmine/QUnit/SimonJS)
Модели	
• Модель	‑	это	одна	запись.	
• Содержит	интерактивные	данные	
• Реализует	
   –   Конвертацию	
   –   Валидацию	
   –   Вычисление	свойств	
   –   Контроль	доступа	
• Реализуется	посредством	наследования	стандартного	класса	
  Backbone.Model	
• Базовый	класс	набор	необходимых	и	вспомогательных	

  методов	для	работы	со	свойствами	(get/set,	escape,	has,	
  toJSON,	fetch,	isValid,	validate,	save	и.т.п.)
Пример	
                                    	




var	Photo	=	Backbone.Model.extend({
				defaults:	{
								src:	'placeholder.jpg',
								title:	'an	image	placeholder',
								coordinates:	[0,0]
				},
				initialize:	function()	{
								this.on("change:src",	function()	{
												var	src	=	this.get("src");
												console.log('Image	source	updated	to	'	+	src);
								});
				},
				changeSrc:	function(	source	)	{
								this.set({	src:	source	});

				}
});

var	somePhoto	=	new	Photo({	src:	"test.jpg",	title:"testing"});
somePhoto.changeSrc("magic.jpg");	//	which	triggers	"change:src"	and	logs	update
Пример	валидации	
                  	




var	Photo	=	Backbone.Model.extend({
				validate:	function(attribs){
								if(attribs.src	===	undefined){
												return	"Remember	to	set	a	source	for	your	image!";
								}
				},

				initialize:	function(){
								console.log('this	model	has	been	initialized');
								this.on("error",	function(model,	error){
												console.log(error);
								});
				}
});


var	myPhoto	=	new	Photo();
myPhoto.set({	title:	"On	the	beach"	});
//logs	Remember	to	set	a	source	for	your	image!
Коллекции	
• Позаимствованы	из	http://underscorejs.org/	
   – Унаследовали	все	методы	
• Множество	моделей,	для	которого	реализованы:	
   – Фильтрация	
   – Сортировка	
   – Агрегация	
• Реализуются	посредством	наследования	стандартного	класса	
  Backbone.Collection	
• Базовый	класс	также	реализует	полезные	методы	(get,	set,	
  length,	push,	pop,	sort,	create,	fetch,	pluck,	where,	...)	

• Позволяют	централизовано	работать	с	несколькими	моделями	
• Можно	написать	свой	comparator
Пример	коллекции	
                 	




var	PhotoCollection	=	Backbone.Collection.extend({
				model:	Photo
});	
	
var	a	=	new	Photo({	title:	'my	vacation'}),
				b	=	new	Photo({	title:	'my	holiday'}),
				c	=	new	Photo({	title:	'my	weekend'});

var	photoCollection	=	new	PhotoCollection([a,b]);
photoCollection.add(c);

photoCollection.remove([a,b]);
photoCollection.remove(c);
Пример	коллекции	
                   	




var	PhotoCollection	=	new	Backbone.Collection();
PhotoCollection.on("add",	function(photo)	{
		console.log("I	liked	"	+	photo.get("title")	+	'	it's	this	one,	right?	'		+	photo.get("src"));
});

PhotoCollection.add([
		{title:	"My	trip	to	Bali",	src:	"bali‑trip.jpg"},
		{title:	"The	flight	home",	src:	"long‑flight‑oofta.jpg"},
		{title:	"Uploading	pix",	src:	"too‑many‑pics.jpg"}
]);	
	
var	sortedByAlphabet	=	PhotoCollection.sortBy(function	(photo)	{
				return	photo.get("title").toLowerCase();
});
Представления	
• Главная	идея	‑	собрать	интерфейс	из	
  представлений,	связанных	с	моделью	
• Реиспользуемый	элемент	
  пользовательского	интерфейса	
• Не	содержит	вёрстку	документа	
• Часто	ассоциирован	с	моделью	

• Создается	посредством	наследования	
  базового	класса	Backbone.View
Пример	представления	
           	




var	PhotoSearch	=	Backbone.View.extend({
				el:	$('#results'),
				render:	function(	event	){
								var	compiled_template	=	_.template(	$("#results‑template").html()	);
								this.$el.html(	compiled_template(this.model.toJSON())	);
								return	this;	//recommended	as	this	enables	calls	to	be	chained.
				},
				events:	{
								"submit	#searchForm":		"search",
								"click	.reset":	"reset",
								"click	.advanced":	"switchContext"
				},
				search:	function(	event	){
								//executed	when	a	form	'#searchForm'	has	been	submitted
				},
				reset:	function(	event	){

								//executed	when	an	element	with	class	"reset"	has	been	clicked.
				},
				switchContext:	function(	event	){
								//executed	when	an	element	with	class	"advanced"	has	been	clicked.
				}
});
Пример	представления	
           	




•   el	‑	это	DOM‑элемент	представления	
tagName:	'p',	//	required,	but	defaults	to	'div'	if	not	set
className:	'container',	//	optional,	you	can	assign	multiple	classes	to	this	property	like	so	'container	
homepage'
id:	'header',	//	optional	
•   Код	выше	создаст	следующий	DOMElement	(но	не	добавит	его	в	
    дерево):	
<p	id="header"	class="container"></p>	
•   Фунция	render()	определяет	отображение	представления	на	странице	
•   Исходные	данные	обычно	задаются	в	JSON‑формате	
•   Для	её	реализации	чаще	всего	используется	сторонний	
    js‑шаблонизатор	(например:	
    http://documentcloud.github.com/underscore/#template)	
     – Сюда	то	и	уходит	весь	быдлокод	;)
Пример	шаблонизатора	
var	compiled	=	_.template("hello:	<%=	name	%>");
compiled({name	:	'moe'});
	
=>	"hello:	moe"

var	list	=	"<%	_.each(people,	function(name)	{	%>	<li><%=	name	%></li>	<%	});	%>";
_.template(list,	{people	:	['moe',	'curly',	'larry']});
	
=>	"<li>moe</li><li>curly</li><li>larry</li>"

var	template	=	_.template("<b><%=	value	%></b>");
template({value	:	'<script>'});
	
=>	"<b>&lt;script&gt;</b>"
Маршрутизация	(Router)	
   	




• До	версии	0.5	назывался	Controller	;)	
• Мэпит	ссылки	(URL)	на	функции	в	js	
  – Адресация	в	веб‑приложении	
  – Работа	с	историей	в	браузере	
       • на	низком	уровне:	hashchange	или	HTML5	
         pushState	
       • После	того	как	создали	все	роутеры	нужно	
        скомандовать	startBackbone.history.start,	чтобы	
        история	начала	вестись
var	GalleryRouter	=	Backbone.Router.extend({
				routes:	{
								"about"	:	"showAbout",	http://unicorns.com/#	<about
								"photos/:id"	:	"getPhoto",	//	http://unicorns.com/#photos/5
								"search/:query"	:	"searchPhotos",	//	http://unicorns.com/#search/lolcats
								"search/:query/p:page"	:	"searchPhotos",	//	http://unicorns.com/#search/lolcats/p1
								"photos/:id/download/*imagePath"	:	"downloadPhoto",		
								//	http://unicorns.com/#photos/5/download/files/lolcat‑car.jpg
								"*other"				:	"defaultRoute"	//	http://unicorns.com/#	<anything
				},

				showAbout:	function(){
				},

				getPhoto:	function(id){
								console.log("You	are	trying	to	reach	photo	"	+	id);
				},

				searchPhotos:	function(query,	page){
								var	page_number	=	page	||	1;
								console.log("Page	number:	"	+	page_number	+	"	of	the	results	for	"	+	query);
				},

				downloadPhoto:	function(id,	path){
				},

				defaultRoute:	function(other){
								console.log("Invalid.	You	attempted	to	reach:"	+	other);
				}
});

var	myGalleryRouter	=	new	GalleryRouter();
Зачем	нужен?	
• Придать	структуру	клиентскому	коду	
• Упростить	CRUD	данных	с	сервера	
  (персистентность)	
• Синхронизация	объектов	на	сервере,	js	и	DOM	
• Уменьшить	рост	количества	кода	на	
      – Модели	
      – Представления	
      – Маршрутизацию	
• Что‑то	ещё	(я	не	всё	про	него	знаю)
Персистентность	
                 	




• Реализуется	посредством	функции	Backbone.sync	
   – Она	вызывается	при	каждой	попытке	прочитать/записать	данные	для	
     модели	с	сервера	(fetch/save	...)	
       • url	запроса	определяется	свойством	model.url()	или	model.urlRoot()	
   – По	умолчанию	использует	jQuery.ajax	
   – Может	быть	переопределена,	например	чтобы	использовать	WebSockets	
   – По	умолчанию	преобразует	команды	в	следующие	REST‑запросы:	
   – create	→	POST			/collection
     read	→	GET			/collection[/id]
     update	→	PUT			/collection/id
     delete	→	DELETE			/collection/id	
   	

   Пример	обработчика	на	RoR:	
   def	update
   		account	=	Account.find	params[:id]
   		account.update_attributes	params
   		render	:json	=>	account
   end
Где	почитать?	
• Официальная	документация	(http://backbonejs.org/)	
    – Не	хочешь	учить	англ?	http://backbonejs.ru/	
• Developing	Backbone.js	Applications	
  (http://addyosmani.github.com/backbone‑fundamentals/)
  	
   –   Основы	
   –   Примеры	(готовый	TODO‑лист)	
   –   Тестирование	
   –   Модульность	

   – Расширения	
• Для	чайников:	http://habrahabr.ru/post/127049/	
• Презентация	про	альтернативу:	
  http://prezi.com/plv0byja9ubh/mvvm‑knockoutjs/
Альтернативы	
•   Knockout	(http://knockoutjs.com/)	
•   Ember.js	(http://emberjs.com/)	
•   AngularJS	(http://angularjs.org/)	
•   SpineJS	(http://spinejs.com/docs/index)	
    – Очень	любопытный	аналог	
    – Написан	на	coffee‑script	

      (http://coffeescript.org/)

Más contenido relacionado

La actualidad más candente

Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноRoman Dvornov
 
Опыт разработки эффективного SPA
Опыт разработки эффективного SPAОпыт разработки эффективного SPA
Опыт разработки эффективного SPAEugene Abrosimov
 
Профилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаprivate_face
 
Drupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupalCamp Kyiv Рысь
 
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"Yandex
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.Igor Shkulipa
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"oelifantiev
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CYandex
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"Roman Dvornov
 
Повышаем производительность Drupal-сайта
Повышаем производительность Drupal-сайтаПовышаем производительность Drupal-сайта
Повышаем производительность Drupal-сайтаВладимир Колос
 
Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Technopark
 

La actualidad más candente (13)

Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективно
 
Backbone js
Backbone jsBackbone js
Backbone js
 
Опыт разработки эффективного SPA
Опыт разработки эффективного SPAОпыт разработки эффективного SPA
Опыт разработки эффективного SPA
 
Drupal 7 and History.js
Drupal 7 and History.jsDrupal 7 and History.js
Drupal 7 and History.js
 
Профилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кода
 
Drupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайт
 
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"
 
Повышаем производительность Drupal-сайта
Повышаем производительность Drupal-сайтаПовышаем производительность Drupal-сайта
Повышаем производительность Drupal-сайта
 
Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1
 

Destacado (8)

Linux Kernel Processes
Linux Kernel ProcessesLinux Kernel Processes
Linux Kernel Processes
 
SuSE Studio
SuSE StudioSuSE Studio
SuSE Studio
 
Smalltalk
SmalltalkSmalltalk
Smalltalk
 
Dev collaboration
Dev collaborationDev collaboration
Dev collaboration
 
Multiplayer
MultiplayerMultiplayer
Multiplayer
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
Lovely scrum
Lovely scrumLovely scrum
Lovely scrum
 
Nosql and Mongodb
Nosql and MongodbNosql and Mongodb
Nosql and Mongodb
 

Similar a Backbone.js

Backbone.js Профилактика сколиоза
Backbone.js Профилактика сколиоза Backbone.js Профилактика сколиоза
Backbone.js Профилактика сколиоза MitinPavel
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?buranLcme
 
Bootstrap 3. Адаптивная верстка для WordPress
Bootstrap 3. Адаптивная верстка для WordPressBootstrap 3. Адаптивная верстка для WordPress
Bootstrap 3. Адаптивная верстка для WordPressIgor Sazonov
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Yii2
Yii2Yii2
Yii2Noveo
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловGeeksLab Odessa
 
Арсений Заречнев и Федор Шумов - Одностраничные приложения
Арсений Заречнев и Федор Шумов - Одностраничные приложенияАрсений Заречнев и Федор Шумов - Одностраничные приложения
Арсений Заречнев и Федор Шумов - Одностраничные приложенияArseny Zarechnev
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Dev_Party
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.Igor Shkulipa
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7Technopark
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview ReleaseDenis Shestakov
 
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир ДупелевRich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир ДупелевOntico
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Frontendlab: Фреймворк Duranda js - Виктор Сотов
Frontendlab: Фреймворк Duranda js  - Виктор СотовFrontendlab: Фреймворк Duranda js  - Виктор Сотов
Frontendlab: Фреймворк Duranda js - Виктор СотовGeeksLab Odessa
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Fedor Lavrentyev
 

Similar a Backbone.js (20)

Backbone.js Профилактика сколиоза
Backbone.js Профилактика сколиоза Backbone.js Профилактика сколиоза
Backbone.js Профилактика сколиоза
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
 
Bootstrap 3. Адаптивная верстка для WordPress
Bootstrap 3. Адаптивная верстка для WordPressBootstrap 3. Адаптивная верстка для WordPress
Bootstrap 3. Адаптивная верстка для WordPress
 
Bootstrap 3
Bootstrap 3Bootstrap 3
Bootstrap 3
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Yii2
Yii2Yii2
Yii2
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
Арсений Заречнев и Федор Шумов - Одностраничные приложения
Арсений Заречнев и Федор Шумов - Одностраничные приложенияАрсений Заречнев и Федор Шумов - Одностраничные приложения
Арсений Заречнев и Федор Шумов - Одностраничные приложения
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир ДупелевRich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Frontendlab: Фреймворк Duranda js - Виктор Сотов
Frontendlab: Фреймворк Duranda js  - Виктор СотовFrontendlab: Фреймворк Duranda js  - Виктор Сотов
Frontendlab: Фреймворк Duranda js - Виктор Сотов
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
 

Backbone.js