SlideShare a Scribd company logo
http://documentcloud.github.com/backbone/




вторник, 15 ноября 11 г.
Типичный application.js:
                           1. Код не имеет структуры - набор обработчиков
                           событий




                           2. Код растет - тяжело ориентироваться




                           3. Совсем не просто проследить логику
                           взаимодействия объектов на странице




вторник, 15 ноября 11 г.
Рефакторинг - использование волшебных (function(){})()
    var MyCoolModule       =   (function(opts){     1. Код чуть более структурирован - функционал
        //public variable
                                                    организован в модули
       this.settings = opts;

       //private var
       var bla = 0;

       //public method                              2. Код отдельного модуля продолжает оставаться
       this.reset = function (){}                   довольно тяжелым и неструктурированным -
                                                    генерация html, обмен данными смешано
       //private method
       function init(){};

       //initializer
      self.init();                                  3. Если страница довольна интерактивна и объемна -
    })();                                           для оптимизации скорости и потребления памяти сырые
                                                    данные хранятся в данных js - скорее всего в объекте(ах)

    Используем:                                     глобального пространства имен.


   var myCoolObject = new MyCoolModule({params});
   //call of public functions
   myCoolObject.reset();


                                                    4. Скорее всего в этот момент мы уже воспринимаем нашу
                                                    страницу как набор объектов(визуальных,объектов по типу
                                                    данных) - но js код остается в виде методов класса, т.е.
                                                    соответствующих объектов(инкапсулирующих данные,
                                                    представляющие АПИ) - нет. Как следствие -
                                                    дополнительные расходы на работу с html кодом,
                                                    идентификацию классов источника события и пр.




вторник, 15 ноября 11 г.
Рефакторинг - MVC
  1. Bacbone.js - легковесен, дает только шаблон, обеспечивая
  свободу, не требует специального html кода
  2. Knockout.js - Model-View-ViewModel (MVVM), работает с
  помощью data аттрибутов, что означает специальный html код
  3. Sproutcore - мощный и тяжеловесный, включает MVC
  фреймворк и визуальные компоненты
  4. Require JS - по сути больше п.6, но использует AMD
  (Asynchronous Module Definition) - загрузку js по требованию и
  ассинхронно
  5. etc
  6. Custom implementations - можно написать и самому :)




вторник, 15 ноября 11 г.
Backbone.js - структура
 https://github.com/codebrew/backbone-rails
 rails g backbone:scaffold Post title:string content:string



                                                         1. Models - компонент, позволяющий организовать обмен
                                                         данными, предоставляет события(изменение, добавление...), на
                                                         которые могут подписываться Views




                                                         2. Routers - Его назначение обработка хеш навигации в приложении. В
                                                         современных браузерах это прямое управление адресной строкой, в
                                                         остальных - эмуляция через якорные ссылки(#..., настраиваемо)




                                                         3. Templates - в общем-то любой шаблонизатор(встроенный в
                                                         Underscore, EJS, JQTemplates, Mustache, Handlabars)




                                                        4. Views - ООП подход, те каждая вью отвечает за
                                                        определенный блок на странице. Если блоков несколько - то
                                                        будет несколько экземпляров вью, каждый из который хранит в
                                                        себе конкретную информацию(настройку) на логический блок.
                                                        Ограничений нет - блоки логические.




вторник, 15 ноября 11 г.
1. Router
 class Apihelp.Routers.PostsRouter extends Backbone.Router        Структура роутера:
   initialize: (options) ->                                       1. Хеш(функция, возращающая хеш) - определяет урл и соответствующее
     @posts = new Apihelp.Collections.PostsCollection()           ему действие обработчик
     @posts.reset options.posts                                   2. Набор функций обработчиков - на вход получают параметры, указанные
                                                                  в определении URL.
   routes:
    "/new"         : "newPost"
    "/index" : "index"
    "/:id/edit" : "edit"
    "/:id"     : "show"
    ".*"       : "index"

   newPost: ->
    @view = new Apihelp.Views.Posts.NewView(collection: @posts)
    $("#posts").html(@view.render().el)

   index: ->
     @view = new Apihelp.Views.Posts.IndexView(posts: @posts)
     $("#posts").html(@view.render().el)

   show: (id) ->
    post = @posts.get(id)

    @view = new Apihelp.Views.Posts.ShowView(model: post)
    $("#posts").html(@view.render().el)

   edit: (id) ->
    post = @posts.get(id)

    @view = new Apihelp.Views.Posts.EditView(model: post)
    $("#posts").html(@view.render().el)




вторник, 15 ноября 11 г.
2. View
                                                            Структура View:


 Apihelp.Views.Posts ||= {}
                                                            1. View наследуется от базового класса Baclbone.View, но может
 class Apihelp.Views.Posts.EditView extends Backbone.View
   template : JST["backbone/templates/posts/edit"]          насловедоваться и от другой вью

   events :
    "submit #edit-post" : "update"

   update : (e) ->
    e.preventDefault()                                      2. Шаблонизатор можно использовать любой, рекомендую
    e.stopPropagation()                                     Mustache(Hadlebars). Определять явно не обязательно, но удобно поскольку
                                                            сразу видно какие шаблоны используются в данной вью.
    @model.save(null,
      success : (post) =>
       @model = post
       window.location.hash = "/#{@model.id}"
    )                                                       3. Хеш реакций на события - позволяет определять любые события внутри
                                                            html блока вью(нет просмотра всего DOM страницы, только относительно
   render : ->                                              текущей view - для работы с DOM вью также есть сокращение this.$()) и
    $(this.el).html(this.template(@model.toJSON() ))        функций обработчиков. В каждый обработчик передает конктекс текущей
                                                            View(this) и пераметр, имеющий всю нужную информацию об источнике
    this.$("form").backboneLink(@model)                     события.
    return this


                                                            4. Набор обработчков событий и просто служебных функций




вторник, 15 ноября 11 г.
3. Model && Collection
                                                     Модель - предназначена для хранения логики, относящейся к конкретному
                                                     объекту - преобразования, валидации, кастомная логика, свойства и
                                                     собственно структура объектов




                                                     Коллекция - упорядоченный найбор объекто моделей. Предоставляет
                                                     события об изменения в моделях, появлении новых и пр. Предоставляет
                                                     методы для обновления, сохранения, сравнения данных, включая
                                                     взимодействие с сервером
 class Apihelp.Models.Post extends Backbone.Model
   paramRoot: 'post'

   defaults:
    title: null
    content: null
                                                     Существуют множество реализаций моделей и их способом взиамодействия
 class Apihelp.Collections.PostsCollection extends   с сервером - rest api(rails), websocket и другие
 Backbone.Collection
   model: Apihelp.Models.Post
   url: '/posts'




                                                     Интегрированы методы Underscore.js, для обработки наборов моделей




вторник, 15 ноября 11 г.
4. Templates
                                                                     Backbone дает свободу выбора шаблонизатора(Jquery Templates, Underscore,
                                                                     EJS,Mustache, и еще тонна существующих)


 <h1>Edit post</h1>

 <form id="edit-post" name="post">
  <div class="field">
   <label for="title"> title:</label>
   <input type="text" name="title" id="title" value={{ title }} >
  </div>
                                                                     НО! Самый удобный способ - когда шаблоны на стороне сервера
  <div class="field">                                                 компилируются в один файл, содержащий JS функций, собранный в
    <label for="content"> content:</label>                           массив(JST):
    <input type="text" name="content" id="content"                   - не загрязняется html
 value={{ content }} >                                               - систематизация позволяет динамически конструировать вызовы шаблонов
  </div>

  <div class="actions">
   <input type="submit" value="Update Post" />
  </div>

 </form>

 <a href="#/index">Back</a>                                         Rails.version <3.1 => Jammit
                                                                    Rails.version >=3.1 => AssetPipeline(HadleBars + HadleBars Assets) || Jammit




вторник, 15 ноября 11 г.
To sum up:
    1MVC(Backbone) - не панацея. Это удобный инстурмент,
    когда JS кода много.
    2. Backbone - позволяет структурировать JS код по типу
    Rails приложения, что облегчает его поддержку и развитие
    3. События позволяют сделать код слабо связанным -
    облегчает структура приложения
    4. Production ready




      THE END


вторник, 15 ноября 11 г.

More Related Content

PPTX
Backbone lesson 1
PPT
Tapestry it is simple
PDF
Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011
PPT
Cookies, session и другое в JSP
PDF
Лекция #7. Django ORM
PDF
Шаблоны проектирования в Magento
PDF
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...
PPT
Drupal организация разработки
Backbone lesson 1
Tapestry it is simple
Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011
Cookies, session и другое в JSP
Лекция #7. Django ORM
Шаблоны проектирования в Magento
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...
Drupal организация разработки

What's hot (20)

PDF
Backbone.js
PPT
Drupal -organizaciya_razrabotki
PDF
Первые шаги после установки WordPress
PPTX
лабораторная работа №4 uml
PDF
Rambler.iOS #5: Подмодули в VIPER
PDF
C# Web. Занятие 01.
PPTX
Лабораторная работа № 4. МАПО - диаграммы uml
PDF
Внутреннее устройство и оптимизация бандла webpack
PDF
Разработка и deploy Drupal сайтов с помощью Features.
PPT
Инсталляционные профили, создание сборок
PDF
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
PDF
Grails & Groovy
PPT
Контент ориентированное программирование
PPT
идеология Drupal 8 уже в drupal 7 вячеслав касихин
PDF
ДАМП 2015 Екатеринбург
PDF
Ограничение доступа в ruby on rails
PDF
МАИ, Сети ЭВМ, Лекция №5
PDF
PDF
iOS-03-Управление памятью
Backbone.js
Drupal -organizaciya_razrabotki
Первые шаги после установки WordPress
лабораторная работа №4 uml
Rambler.iOS #5: Подмодули в VIPER
C# Web. Занятие 01.
Лабораторная работа № 4. МАПО - диаграммы uml
Внутреннее устройство и оптимизация бандла webpack
Разработка и deploy Drupal сайтов с помощью Features.
Инсталляционные профили, создание сборок
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
Grails & Groovy
Контент ориентированное программирование
идеология Drupal 8 уже в drupal 7 вячеслав касихин
ДАМП 2015 Екатеринбург
Ограничение доступа в ruby on rails
МАИ, Сети ЭВМ, Лекция №5
iOS-03-Управление памятью
Ad

Viewers also liked (7)

PPTX
16/12/2011 - Rinnovo della fiducia al Consigliere Comunale del M5S Fabio Fucci
PPSX
M5S Pomezia - Esito questionari rifiuti
PPT
Christopher Brown's Portfolio
PDF
Water bottle incident
PPS
Lhan sel_uk__a__p_kal_yorum
PPTX
2015 WP AP Scholars
PPT
Mambo Health Gaming, Games for Health 2011
16/12/2011 - Rinnovo della fiducia al Consigliere Comunale del M5S Fabio Fucci
M5S Pomezia - Esito questionari rifiuti
Christopher Brown's Portfolio
Water bottle incident
Lhan sel_uk__a__p_kal_yorum
2015 WP AP Scholars
Mambo Health Gaming, Games for Health 2011
Ad

Similar to Backbone js (20)

PPT
Арсений Заречнев и Федор Шумов - Одностраничные приложения
PDF
Backbone.js Профилактика сколиоза
PDF
Арсений Заречнев и Федор Шумов - Одностраничные приложения
PDF
Ember.js ответ на почти все вопросы - java script frameworks day 2014
PDF
basis.js - почему я не бросил разрабатывать свой фреймворк
PDF
C# Web. Занятие 16.
PPT
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
PDF
Backbonejs Full Stack
PDF
Опыт разработки эффективного SPA
PDF
Jsfwdays 2013-2
PDF
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
PDF
Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"
PDF
Изоморфный JavaScript — будущее уже здесь
PDF
Изоморфные Java script приложения с catberry.js
PPTX
PPTX
Full Stack разработка на JavaScript
PPTX
Опыт работы с фреймворком ASP.NET MVC
PDF
YaC 2013 Notes
PPT
JavaScript-библиотека
Арсений Заречнев и Федор Шумов - Одностраничные приложения
Backbone.js Профилактика сколиоза
Арсений Заречнев и Федор Шумов - Одностраничные приложения
Ember.js ответ на почти все вопросы - java script frameworks day 2014
basis.js - почему я не бросил разрабатывать свой фреймворк
C# Web. Занятие 16.
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Backbonejs Full Stack
Опыт разработки эффективного SPA
Jsfwdays 2013-2
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"
Изоморфный JavaScript — будущее уже здесь
Изоморфные Java script приложения с catberry.js
Full Stack разработка на JavaScript
Опыт работы с фреймворком ASP.NET MVC
YaC 2013 Notes
JavaScript-библиотека

Backbone js

  • 2. Типичный application.js: 1. Код не имеет структуры - набор обработчиков событий 2. Код растет - тяжело ориентироваться 3. Совсем не просто проследить логику взаимодействия объектов на странице вторник, 15 ноября 11 г.
  • 3. Рефакторинг - использование волшебных (function(){})() var MyCoolModule = (function(opts){ 1. Код чуть более структурирован - функционал //public variable организован в модули this.settings = opts; //private var var bla = 0; //public method 2. Код отдельного модуля продолжает оставаться this.reset = function (){} довольно тяжелым и неструктурированным - генерация html, обмен данными смешано //private method function init(){}; //initializer self.init(); 3. Если страница довольна интерактивна и объемна - })(); для оптимизации скорости и потребления памяти сырые данные хранятся в данных js - скорее всего в объекте(ах) Используем: глобального пространства имен. var myCoolObject = new MyCoolModule({params}); //call of public functions myCoolObject.reset(); 4. Скорее всего в этот момент мы уже воспринимаем нашу страницу как набор объектов(визуальных,объектов по типу данных) - но js код остается в виде методов класса, т.е. соответствующих объектов(инкапсулирующих данные, представляющие АПИ) - нет. Как следствие - дополнительные расходы на работу с html кодом, идентификацию классов источника события и пр. вторник, 15 ноября 11 г.
  • 4. Рефакторинг - MVC 1. Bacbone.js - легковесен, дает только шаблон, обеспечивая свободу, не требует специального html кода 2. Knockout.js - Model-View-ViewModel (MVVM), работает с помощью data аттрибутов, что означает специальный html код 3. Sproutcore - мощный и тяжеловесный, включает MVC фреймворк и визуальные компоненты 4. Require JS - по сути больше п.6, но использует AMD (Asynchronous Module Definition) - загрузку js по требованию и ассинхронно 5. etc 6. Custom implementations - можно написать и самому :) вторник, 15 ноября 11 г.
  • 5. Backbone.js - структура https://github.com/codebrew/backbone-rails rails g backbone:scaffold Post title:string content:string 1. Models - компонент, позволяющий организовать обмен данными, предоставляет события(изменение, добавление...), на которые могут подписываться Views 2. Routers - Его назначение обработка хеш навигации в приложении. В современных браузерах это прямое управление адресной строкой, в остальных - эмуляция через якорные ссылки(#..., настраиваемо) 3. Templates - в общем-то любой шаблонизатор(встроенный в Underscore, EJS, JQTemplates, Mustache, Handlabars) 4. Views - ООП подход, те каждая вью отвечает за определенный блок на странице. Если блоков несколько - то будет несколько экземпляров вью, каждый из который хранит в себе конкретную информацию(настройку) на логический блок. Ограничений нет - блоки логические. вторник, 15 ноября 11 г.
  • 6. 1. Router class Apihelp.Routers.PostsRouter extends Backbone.Router Структура роутера: initialize: (options) -> 1. Хеш(функция, возращающая хеш) - определяет урл и соответствующее @posts = new Apihelp.Collections.PostsCollection() ему действие обработчик @posts.reset options.posts 2. Набор функций обработчиков - на вход получают параметры, указанные в определении URL. routes: "/new" : "newPost" "/index" : "index" "/:id/edit" : "edit" "/:id" : "show" ".*" : "index" newPost: -> @view = new Apihelp.Views.Posts.NewView(collection: @posts) $("#posts").html(@view.render().el) index: -> @view = new Apihelp.Views.Posts.IndexView(posts: @posts) $("#posts").html(@view.render().el) show: (id) -> post = @posts.get(id) @view = new Apihelp.Views.Posts.ShowView(model: post) $("#posts").html(@view.render().el) edit: (id) -> post = @posts.get(id) @view = new Apihelp.Views.Posts.EditView(model: post) $("#posts").html(@view.render().el) вторник, 15 ноября 11 г.
  • 7. 2. View Структура View: Apihelp.Views.Posts ||= {} 1. View наследуется от базового класса Baclbone.View, но может class Apihelp.Views.Posts.EditView extends Backbone.View template : JST["backbone/templates/posts/edit"] насловедоваться и от другой вью events : "submit #edit-post" : "update" update : (e) -> e.preventDefault() 2. Шаблонизатор можно использовать любой, рекомендую e.stopPropagation() Mustache(Hadlebars). Определять явно не обязательно, но удобно поскольку сразу видно какие шаблоны используются в данной вью. @model.save(null, success : (post) => @model = post window.location.hash = "/#{@model.id}" ) 3. Хеш реакций на события - позволяет определять любые события внутри html блока вью(нет просмотра всего DOM страницы, только относительно render : -> текущей view - для работы с DOM вью также есть сокращение this.$()) и $(this.el).html(this.template(@model.toJSON() )) функций обработчиков. В каждый обработчик передает конктекс текущей View(this) и пераметр, имеющий всю нужную информацию об источнике this.$("form").backboneLink(@model) события. return this 4. Набор обработчков событий и просто служебных функций вторник, 15 ноября 11 г.
  • 8. 3. Model && Collection Модель - предназначена для хранения логики, относящейся к конкретному объекту - преобразования, валидации, кастомная логика, свойства и собственно структура объектов Коллекция - упорядоченный найбор объекто моделей. Предоставляет события об изменения в моделях, появлении новых и пр. Предоставляет методы для обновления, сохранения, сравнения данных, включая взимодействие с сервером class Apihelp.Models.Post extends Backbone.Model paramRoot: 'post' defaults: title: null content: null Существуют множество реализаций моделей и их способом взиамодействия class Apihelp.Collections.PostsCollection extends с сервером - rest api(rails), websocket и другие Backbone.Collection model: Apihelp.Models.Post url: '/posts' Интегрированы методы Underscore.js, для обработки наборов моделей вторник, 15 ноября 11 г.
  • 9. 4. Templates Backbone дает свободу выбора шаблонизатора(Jquery Templates, Underscore, EJS,Mustache, и еще тонна существующих) <h1>Edit post</h1> <form id="edit-post" name="post"> <div class="field"> <label for="title"> title:</label> <input type="text" name="title" id="title" value={{ title }} > </div> НО! Самый удобный способ - когда шаблоны на стороне сервера <div class="field"> компилируются в один файл, содержащий JS функций, собранный в <label for="content"> content:</label> массив(JST): <input type="text" name="content" id="content" - не загрязняется html value={{ content }} > - систематизация позволяет динамически конструировать вызовы шаблонов </div> <div class="actions"> <input type="submit" value="Update Post" /> </div> </form> <a href="#/index">Back</a> Rails.version <3.1 => Jammit Rails.version >=3.1 => AssetPipeline(HadleBars + HadleBars Assets) || Jammit вторник, 15 ноября 11 г.
  • 10. To sum up: 1MVC(Backbone) - не панацея. Это удобный инстурмент, когда JS кода много. 2. Backbone - позволяет структурировать JS код по типу Rails приложения, что облегчает его поддержку и развитие 3. События позволяют сделать код слабо связанным - облегчает структура приложения 4. Production ready THE END вторник, 15 ноября 11 г.