SlideShare a Scribd company logo
Радослав Станков
      OpenFest            05/11/2011




Tuesday, November 8, 11
Кой съм аз?

                @rstankov




                http://rstankov.com
                http://github.com/rstankov

Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser




                                  Controller




                          Model                View


                                  Сървър
Tuesday, November 8, 11
Browser
                          Dom




                          View




                          Model


Tuesday, November 8, 11
Browser
                          Dom




                          View




                          Model


Tuesday, November 8, 11
Browser
                          Dom




                          View




                          Model


Tuesday, November 8, 11
Browser
                          Dom




                          View




                          Model


Tuesday, November 8, 11
Browser
                          Dom




                          View




                          Model


Tuesday, November 8, 11
Browser
                          Dom




                          View




                          Model


Tuesday, November 8, 11
Browser
                          Dom




                          View




                          Model


Tuesday, November 8, 11
Browser
                          Dom




                          View




                          Model


Tuesday, November 8, 11
Browser
                          Dom




                          View




                          Model


Tuesday, November 8, 11
Backbone.Events



Tuesday, November 8, 11
var object = {};

        $.extend(object, Backbone.Events);

        object.bind('eventName', function() {
          console.log('1');
        });

        object.bind('eventName', function() {
          console.log('2');
        });

        object.trigger('eventName');

        // prints '1' and '2'


Tuesday, November 8, 11
var object = {};

        $.extend(object, Backbone.Events);

        object.bind('eventName', function() {
          console.log('1');
        });

        object.bind('eventName', function() {
          console.log('2');
        });

        object.trigger('eventName');

        // prints '1' and '2'


Tuesday, November 8, 11
var object = {};

        $.extend(object, Backbone.Events);

        object.bind('eventName', function() {
          console.log('1');
        });

        object.bind('eventName', function() {
          console.log('2');
        });

        object.trigger('eventName');

        // prints '1' and '2'


Tuesday, November 8, 11
var object = {};

        $.extend(object, Backbone.Events);

        object.bind('eventName', function() {
          console.log('1');
        });

        object.bind('eventName', function() {
          console.log('2');
        });

        object.trigger('eventName');

        // prints '1' and '2'


Tuesday, November 8, 11
var object = {};

        $.extend(object, Backbone.Events);

        object.bind('eventName', function() {
          console.log('1');
        });

        object.bind('eventName', function() {
          console.log('2');
        });

        object.trigger('eventName');

        // prints '1' and '2'


Tuesday, November 8, 11
Backbone.Model



Tuesday, November 8, 11
var Person = Backbone.Model.extend({
       initialize: function(){
         console.log("I'm alive!");
       }
     });

     new Person();




Tuesday, November 8, 11
var Person = Backbone.Model.extend({
       initialize: function(){
         console.log("I'm alive!");
       }
     });

     new Person();




Tuesday, November 8, 11
var Person = Backbone.Model.extend({
       initialize: function(){
         console.log("I'm alive!");
       }
     });

     new Person();




Tuesday, November 8, 11
var Person = Backbone.Model.extend({});

     var me = new Person({name: 'Radoslav'});

     me.get('name');                           // Radoslav
     me.set({lastName: 'Stankov'});
     me.get('lastName');                       // Stankov




Tuesday, November 8, 11
var Person = Backbone.Model.extend({});

     var me = new Person({name: 'Radoslav'});

     me.get('name');                           // Radoslav
     me.set({lastName: 'Stankov'});
     me.get('lastName');                       // Stankov




Tuesday, November 8, 11
var Person = Backbone.Model.extend({});

     var me = new Person({name: 'Radoslav'});

     me.get('name');                           // Radoslav
     me.set({lastName: 'Stankov'});
     me.get('lastName');                       // Stankov




Tuesday, November 8, 11
var Person = Backbone.Model.extend({});

     var me = new Person({name: 'Radoslav'});

     me.get('name');                           // Radoslav
     me.set({lastName: 'Stankov'});
     me.get('lastName');                       // Stankov




Tuesday, November 8, 11
var Person = Backbone.Model.extend({});

     var me = new Person({name: 'Radoslav'});

     me.get('name');                           // Radoslav
     me.set({lastName: 'Stankov'});
     me.get('lastName');                       // Stankov




Tuesday, November 8, 11
var Person = Backbone.Model.extend({
       defaults: {
         name: 'John',
         lastName: 'Doe',
       }
     });

     var me = new Person();
     me.get('name'); // John
     me.get('lastName'); // Doe




Tuesday, November 8, 11
var Person = Backbone.Model.extend({
       defaults: {
         name: 'John',
         lastName: 'Doe',
       }
     });

     var me = new Person();
     me.get('name'); // John
     me.get('lastName'); // Doe




Tuesday, November 8, 11
var Person = Backbone.Model.extend({
       defaults: {
         name: 'John',
         lastName: 'Doe',
       }
     });

     var me = new Person();
     me.get('name'); // John
     me.get('lastName'); // Doe




Tuesday, November 8, 11
var Person = Backbone.Model.extend({
       defaults: {
         name: 'John',
         lastName: 'Doe',
       }
     });

     var me = new Person();
     me.get('name'); // John
     me.get('lastName'); // Doe




Tuesday, November 8, 11
var Calculator = Backbone.Model.extend({
       defaults: {
          value: 0
       },
       value: function(){
          return this.get('value');
       },
       sum: function(value){
          this.set({value: value + this.get('value')});
       },
       reset: function(){
          this.set({value: 0});
       }
     });


Tuesday, November 8, 11
var Calculator = Backbone.Model.extend({
       defaults: {
          value: 0
       },
       value: function(){
          return this.get('value');
       },
       sum: function(value){
          this.set({value: value + this.get('value')});
       },
       reset: function(){
          this.set({value: 0});
       }
     });


Tuesday, November 8, 11
var Calculator = Backbone.Model.extend({
       defaults: {
          value: 0
       },
       value: function(){
          return this.get('value');
       },
       sum: function(value){
          this.set({value: value + this.get('value')});
       },
       reset: function(){
          this.set({value: 0});
       }
     });


Tuesday, November 8, 11
var Calculator = Backbone.Model.extend({
       defaults: {
          value: 0
       },
       value: function(){
          return this.get('value');
       },
       sum: function(value){
          this.set({value: value + this.get('value')});
       },
       reset: function(){
          this.set({value: 0});
       }
     });


Tuesday, November 8, 11
var Calculator = Backbone.Model.extend({
       defaults: {
          value: 0
       },
       value: function(){
          return this.get('value');
       },
       sum: function(value){
          this.set({value: value + this.get('value')});
       },
       reset: function(){
          this.set({value: 0});
       }
     });


Tuesday, November 8, 11
var cal = new Calculator();

     cal.bind('change:value', function(model, value){
       console.log(value);
     });

     cal.bind('change', function(model){
       console.log(model.get('value'));
     });

     cal.bind('all', function(eventName) {
       console.log('I see every thing!', eventName);
     });



Tuesday, November 8, 11
var cal = new Calculator();

     cal.bind('change:value', function(model, value){
       console.log(value);
     });

     cal.bind('change', function(model){
       console.log(model.get('value'));
     });

     cal.bind('all', function(eventName) {
       console.log('I see every thing!', eventName);
     });



Tuesday, November 8, 11
var cal = new Calculator();

     cal.bind('change:value', function(model, value){
       console.log(value);
     });

     cal.bind('change', function(model){
       console.log(model.get('value'));
     });

     cal.bind('all', function(eventName) {
       console.log('I see every thing!', eventName);
     });



Tuesday, November 8, 11
var cal = new Calculator();

     cal.bind('change:value', function(model, value){
       console.log(value);
     });

     cal.bind('change', function(model){
       console.log(model.get('value'));
     });

     cal.bind('all', function(eventName) {
       console.log('I see every thing!', eventName);
     });



Tuesday, November 8, 11
var cal = new Calculator();

     cal.bind('myEvent', function(){
       console.log('KaBoom....');
     });

     cal.trigger('myEvent');




Tuesday, November 8, 11
var Product = Backbone.Model.extend({
       urlRoot: '/products'
     });

     var chair = new Product({
       name: 'chair',
       price: 10
     });

     chair.save();

     // POST /products



Tuesday, November 8, 11
var Product = Backbone.Model.extend({
  url: function(){
    return '/products/' + (this.isNew() ? '' : this.id);
  }
});

var chair = new Product({
  id: 5,
  name: 'chair',
  price: 10
});

chair.save();

// PUT /products/1


Tuesday, November 8, 11
http://documentcloud.github.com/backbone/#Model-save




Tuesday, November 8, 11
И още...
                    • validate
                    • escape
                    • has
                    • unset
                    • clear
                    • hasChanged
                    • changedAttributes
                    • previousAttributes
                    • fetch
                    • toJSON
                    • clone

Tuesday, November 8, 11
Backbone.View



Tuesday, November 8, 11
Tuesday, November 8, 11
var UserNameView = Backbone.View.extend({
       tagName:   'input',
       className: 'string optional',
       id:        'user-name',
       attributes: {
         type: 'string',
         name: 'user[name]'
       }
     });

     var userName = new UserNameView();

     console.log(userName.el);


  <input type="string" name="user[name]" id="user-name" class="string optional">



Tuesday, November 8, 11
var UserNameView = Backbone.View.extend({
       tagName:   'input',
       className: 'string optional',
       id:        'user-name',
       attributes: {
         type: 'string',
         name: 'user[name]'
       }
     });

     var userName = new UserNameView();

     console.log(userName.el);


  <input type="string" name="user[name]" id="user-name" class="string optional">



Tuesday, November 8, 11
var UserNameView = Backbone.View.extend({
       tagName:   'input',
       className: 'string optional',
       id:        'user-name',
       attributes: {
         type: 'string',
         name: 'user[name]'
       }
     });

     var userName = new UserNameView();

     console.log(userName.el);


  <input type="string" name="user[name]" id="user-name" class="string optional">



Tuesday, November 8, 11
var UserNameView = Backbone.View.extend({
       tagName:   'input',
       className: 'string optional',
       id:        'user-name',
       attributes: {
         type: 'string',
         name: 'user[name]'
       }
     });

     var userName = new UserNameView();

     console.log(userName.el);


  <input type="string" name="user[name]" id="user-name" class="string optional">



Tuesday, November 8, 11
var UserNameView = Backbone.View.extend({
       tagName:   'input',
       className: 'string optional',
       id:        'user-name',
       attributes: {
         type: 'string',
         name: 'user[name]'
       }
     });

     var userName = new UserNameView();

     console.log(userName.el);


  <input type="string" name="user[name]" id="user-name" class="string optional">



Tuesday, November 8, 11
var UserNameView = Backbone.View.extend({
       tagName:   'input',
       className: 'string optional',
       id:        'user-name',
       attributes: {
         type: 'string',
         name: 'user[name]'
       }
     });

     var userName = new UserNameView();

     console.log(userName.el);


  <input type="string" name="user[name]" id="user-name" class="string optional">



Tuesday, November 8, 11
var UserNameView = Backbone.View.extend({
       tagName:   'input',
       className: 'string optional',
       id:        'user-name',
       attributes: {
         type: 'string',
         name: 'user[name]'
       }
     });

     var userName = new UserNameView();

     console.log(userName.el);


  <input type="string" name="user[name]" id="user-name" class="string optional">



Tuesday, November 8, 11
var UsersListView = Backbone.View.extend({
       el: '#users-list'
     });

     var userList = new UsersListView();

     console.log(userList.el);




Tuesday, November 8, 11
var EditBoxView = Backbone.View.extend({});

     var element = $('#edit-box-view').get(0),
         editBox = new EditBoxView({el: element});

     console.log(editBox.el === element);




Tuesday, November 8, 11
var DocumentView = Backbone.View.extend({
       events: {
          'dblclick':           'open',
          'click .grid .doc':   'select',
          'customEvent .title': 'custom'
       },
       open:    function() {},
       select: function() {},
       custom: function() {}
     });




Tuesday, November 8, 11
var DocumentView = Backbone.View.extend({
       events: {
          'dblclick':           'open',
          'click .grid .doc':   'select',
          'customEvent .title': 'custom'
       },
       open:    function() {},
       select: function() {},
       custom: function() {}
     });




Tuesday, November 8, 11
var DocumentView = Backbone.View.extend({
       events: {
          'dblclick':           'open',
          'click .grid .doc':   'select',
          'customEvent .title': 'custom'
       },
       open:    function() {},
       select: function() {},
       custom: function() {}
     });




Tuesday, November 8, 11
var DocumentView = Backbone.View.extend({
       events: {
          'dblclick':           'open',
          'click .grid .doc':   'select',
          'customEvent .title': 'custom'
       },
       open:    function() {},
       select: function() {},
       custom: function() {}
     });




Tuesday, November 8, 11
var DocumentView = Backbone.View.extend({
       events: {
          'dblclick':           'open',
          'click .grid .doc':   'select',
          'customEvent .title': 'custom'
       },
       open:    function() {},
       select: function() {},
       custom: function() {}
     });




Tuesday, November 8, 11
var DocumentView = Backbone.View.extend({
       events: {
          'dblclick':           'open',
          'click .grid .doc':   'select',
          'customEvent .title': 'custom'
       },
       open:    function() {},
       select: function() {},
       custom: function() {}
     });




Tuesday, November 8, 11
var DocumentView = Backbone.View.extend({
       events: {
          'dblclick':           'open',
          'click .grid .doc':   'select',
          'customEvent .title': 'custom'
       },
       open:    function() {},
       select: function() {},
       custom: function() {}
     });




Tuesday, November 8, 11
<script type="text/template" id="news">
       <h1><%= title %></h1>
       <time><%= created_at %></time>
       <p><%= text %></p>
     </script>




Tuesday, November 8, 11
var NewsView = Backbone.View.extend({
       template: _.template($('#news').html()),
       render: function() {
         this.el.innerHTML = this.template(this.model);
         return this;
       }
     });




Tuesday, November 8, 11
var view = new NewsView({
       model: {
         title: "News Title",
         created_at: "Today",
         text: "Long text"
       }
     });

     document.body.appendChild(view.render().el);




Tuesday, November 8, 11
<script type="text/template" id="news">
       <h1><%= title %></h1>
       <time><%= created_at %></time>
       <p><%= text %></p>
     </script>




Tuesday, November 8, 11
<div>
       <h1>News Title</h1>
       <time>Today</time>
       <p>Long text</p>
     </div>




Tuesday, November 8, 11
View




                     Model          DOM




Tuesday, November 8, 11
View




                     Model          DOM




Tuesday, November 8, 11
View




                     Model          DOM




Tuesday, November 8, 11
View




                     Model          DOM




Tuesday, November 8, 11
View




                     Model          DOM




Tuesday, November 8, 11
View




                     Model          DOM




Tuesday, November 8, 11
View




                     Model          DOM




Tuesday, November 8, 11
View




                     Model          DOM




Tuesday, November 8, 11
View




                     Model          DOM




Tuesday, November 8, 11
View




                     Model          DOM




Tuesday, November 8, 11
View




                     Model            DOM




                             View 2




Tuesday, November 8, 11
View




                     Model            DOM




                             View 2




Tuesday, November 8, 11
View




                     Model            DOM




                             View 2




Tuesday, November 8, 11
View




                     Model            DOM




                             View 2




Tuesday, November 8, 11
View




                     Model            DOM




                             View 2




Tuesday, November 8, 11
View




                     Model            DOM




                             View 2




Tuesday, November 8, 11
View




                     Model            DOM




                             View 2




Tuesday, November 8, 11
View




                     Model            DOM




                             View 2




Tuesday, November 8, 11
View




                     Model            DOM




                             View 2




Tuesday, November 8, 11
View




                     Model            DOM




                             View 2




Tuesday, November 8, 11
View




                             View 2



                     Model            DOM




Tuesday, November 8, 11
View




                             View 2



                     Model            DOM
                             View 3




Tuesday, November 8, 11
View




                             View 2



                     Model            DOM
                             View 3




                             View 4




Tuesday, November 8, 11
View




                              View 2



                     Model               DOM
                              View 3




                              View 4




                             View .. N




Tuesday, November 8, 11
View




                              View 2



                     Model               DOM
                              View 3




                              View 4




                             View .. N




Tuesday, November 8, 11
View




                              View 2



                     Model               DOM
                              View 3




                              View 4




                             View .. N




Tuesday, November 8, 11
View




                              View 2



                     Model               DOM
                              View 3




                              View 4




                             View .. N




Tuesday, November 8, 11
View




                              View 2



                     Model               DOM
                              View 3




                              View 4




                             View .. N




Tuesday, November 8, 11
View




                              View 2



                     Model               DOM
                              View 3




                              View 4




                             View .. N




Tuesday, November 8, 11
View




                              View 2



                     Model               DOM
                              View 3




                              View 4




                             View .. N




Tuesday, November 8, 11
View




                              View 2



                     Model               DOM
                              View 3




                              View 4




                             View .. N




Tuesday, November 8, 11
View




                              View 2



                     Model               DOM
                              View 3




                              View 4




                             View .. N




Tuesday, November 8, 11
Demo




Tuesday, November 8, 11
var Calculator = Backbone.Model.extend({
       defaults: {
          value: 0
       },
       increment: function() {
          this.set({'value': this.get('value') + 1});
       },
       decrement: function() {
          this.set({'value': this.get('value') - 1});
       },
       getValue: function() {
          return this.get('value');
       }
     });


Tuesday, November 8, 11
var ButtonsView = Backbone.View.extend({
       events: {
          'click .plus': 'plus',
          'click .minus': 'minus'
       },
       plus: function() {
          this.model.increment();
       },
       minus: function() {
          this.model.decrement();
       }
     });



Tuesday, November 8, 11
var DisplayView = Backbone.View.extend({
  initialize: function() {
     this.model.bind('change:value', this.render, this);
     this.render();
  },
  render: function() {
     this.el.innerHTML = this.model.getValue();
     return this;
  }
});




Tuesday, November 8, 11
var cal = new Calculator();

     new ButtonsView({model: cal, el: '.buttons'});
     new DisplayView({model: cal, el: '.display'});




Tuesday, November 8, 11
Backbone.Collection



Tuesday, November 8, 11
var ProductsCollection = Backbone.Collection.extend({
      model: Product
    });

    var products = new ProductsCollection();

    products.fetch();

    products.bind('reset', function(list) {
      console.log('Loaded', list.length, 'records');
    });




Tuesday, November 8, 11
products.bind('add', function(model) {
       console.log('new product added');
     });

     products.bind('remove', function(model) {
       console.log('item product removed');
     });




Tuesday, November 8, 11
И още...


                    • Underscore Methods
                    • add / remove / at
                    • sort / comparator
                    • reset
                    • create
                    • url
                    • toJSON


Tuesday, November 8, 11
Backbone.Router



Tuesday, November 8, 11
Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
var AppRouter = Backbone.Router.extend({
       routes: {
          'pages':            'index',
          'pages/search/:q': 'search',
          'pages/:id':        'show'
       },
       initialize: function() {
          console.log('initialize');
       },
       index: function()        { /* code */ },
       search: function(query) { /* code */ },
       show:    function(id)    { /* code */ }
     });

     var app = new AppRouter();

     Backbone.history.start();

Tuesday, November 8, 11
app.navigate('pages', true);
                     app.navigate('pages/search/title', true);
                     app.navigate('pages/3', true);




Tuesday, November 8, 11
site.com/path#pages
                     site.com/path#pages/search/title
                     site.com/path#pages/3




Tuesday, November 8, 11
Tuesday, November 8, 11
Backbone.history.start({pushState: true});




Tuesday, November 8, 11
site.com/path#pages
                     site.com/path#pages/search/title
                     site.com/path#pages/3




Tuesday, November 8, 11
site.com/path/pages
                     site.com/path/pages/search/title
                     site.com/path/pages/3




Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Tuesday, November 8, 11
Недостатъци



Tuesday, November 8, 11
Алтернативи




Tuesday, November 8, 11
Алтернативи




Tuesday, November 8, 11
Алтернативи




Tuesday, November 8, 11
Алтернативи




Tuesday, November 8, 11
Въпроси?




Tuesday, November 8, 11
Благодаря за вниманието



          @rstankov

Tuesday, November 8, 11

More Related Content

PDF
De vuelta al pasado con SQL y stored procedures
PPTX
Critical evaluation of a master’s thesis
PDF
Mobilys - Mobile Apps Development
DOCX
8 instrumento autoeficacia grupo 8
PDF
PDF
SharePoint TechCon 2009 - 803
PPTX
Bincangkan jurang pencapaian matematik murid sekolah rendah atau sekolah mene...
PDF
Β' ΤΑΞΗ ΥΛΗ ΕΞΕΤΑΣΕΩΝ 2016
De vuelta al pasado con SQL y stored procedures
Critical evaluation of a master’s thesis
Mobilys - Mobile Apps Development
8 instrumento autoeficacia grupo 8
SharePoint TechCon 2009 - 803
Bincangkan jurang pencapaian matematik murid sekolah rendah atau sekolah mene...
Β' ΤΑΞΗ ΥΛΗ ΕΞΕΤΑΣΕΩΝ 2016

Viewers also liked (17)

PPTX
KEPERCAYAAN GURU
PDF
Tsahim 4
PPTX
Opportunity Execution Project - Career Mentor Online
PDF
Hum2310 sm2015 proust questionnaire
PDF
フラグ色々&その遅延評価-仮想機械インタープリタ書きのための-
PPTX
KTI Perkembangan Smartphone di Jember
PDF
상상지니릴레이
PDF
2006 Winter Newsletter
PDF
2001 annual report
PDF
Arh2050 1730 syllabus
PDF
Java Tech & Tools | Big Blobs: Moving Big Data In and Out of the Cloud | Adri...
PDF
Hum2220 sm2015 syllabus
PDF
Errol morris essay
PPTX
квест Pons 1
PPTX
Loopbaanbeleid
PPS
PPTX
(R)evolutionize APM
KEPERCAYAAN GURU
Tsahim 4
Opportunity Execution Project - Career Mentor Online
Hum2310 sm2015 proust questionnaire
フラグ色々&その遅延評価-仮想機械インタープリタ書きのための-
KTI Perkembangan Smartphone di Jember
상상지니릴레이
2006 Winter Newsletter
2001 annual report
Arh2050 1730 syllabus
Java Tech & Tools | Big Blobs: Moving Big Data In and Out of the Cloud | Adri...
Hum2220 sm2015 syllabus
Errol morris essay
квест Pons 1
Loopbaanbeleid
(R)evolutionize APM
Ad

More from OpenFest team (20)

PDF
Understanding your memory usage under Linux
PDF
Embedding FreeBSD: for large and small beds
PDF
Why you can charge for open source software
PDF
Microinvest Warehouse Open
PDF
Как да правим по-добър бизнес с услуги около софтуера с отворен код
PDF
Pf sense 2.0
PDF
Електронни пари: Пътят до BitCoin и поглед напред
PDF
Node.social
PDF
Виртуализирано видеонаблюдение под FreeBSD
PDF
RFID технологии и проблеми със сигурността им
PDF
Redis the better NoSQL
PDF
initLab
PDF
Свободни PLC
PDF
Distributed WPA PSK security audit
PDF
PDF
Why kernelspace sucks?
PDF
Направи си сам суперкомпютър
PDF
Свободни курсове за обучение
PDF
Using Open Source technologies to create Enterprise Level Cloud System
PDF
Emacs reborn
Understanding your memory usage under Linux
Embedding FreeBSD: for large and small beds
Why you can charge for open source software
Microinvest Warehouse Open
Как да правим по-добър бизнес с услуги около софтуера с отворен код
Pf sense 2.0
Електронни пари: Пътят до BitCoin и поглед напред
Node.social
Виртуализирано видеонаблюдение под FreeBSD
RFID технологии и проблеми със сигурността им
Redis the better NoSQL
initLab
Свободни PLC
Distributed WPA PSK security audit
Why kernelspace sucks?
Направи си сам суперкомпютър
Свободни курсове за обучение
Using Open Source technologies to create Enterprise Level Cloud System
Emacs reborn
Ad

Recently uploaded (20)

PPTX
Big Data Technologies - Introduction.pptx
PPT
Teaching material agriculture food technology
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
Spectroscopy.pptx food analysis technology
PDF
Machine learning based COVID-19 study performance prediction
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
Cloud computing and distributed systems.
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Encapsulation theory and applications.pdf
Big Data Technologies - Introduction.pptx
Teaching material agriculture food technology
The AUB Centre for AI in Media Proposal.docx
Understanding_Digital_Forensics_Presentation.pptx
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Building Integrated photovoltaic BIPV_UPV.pdf
Encapsulation_ Review paper, used for researhc scholars
Per capita expenditure prediction using model stacking based on satellite ima...
Digital-Transformation-Roadmap-for-Companies.pptx
Unlocking AI with Model Context Protocol (MCP)
Spectroscopy.pptx food analysis technology
Machine learning based COVID-19 study performance prediction
Diabetes mellitus diagnosis method based random forest with bat algorithm
Cloud computing and distributed systems.
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
“AI and Expert System Decision Support & Business Intelligence Systems”
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Encapsulation theory and applications.pdf

Backbone.js

  • 1. Радослав Станков OpenFest 05/11/2011 Tuesday, November 8, 11
  • 2. Кой съм аз? @rstankov http://rstankov.com http://github.com/rstankov Tuesday, November 8, 11
  • 15. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 16. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 17. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 18. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 19. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 20. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 21. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 22. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 23. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 24. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 25. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 26. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 27. Browser Controller Model View Сървър Tuesday, November 8, 11
  • 28. Browser Dom View Model Tuesday, November 8, 11
  • 29. Browser Dom View Model Tuesday, November 8, 11
  • 30. Browser Dom View Model Tuesday, November 8, 11
  • 31. Browser Dom View Model Tuesday, November 8, 11
  • 32. Browser Dom View Model Tuesday, November 8, 11
  • 33. Browser Dom View Model Tuesday, November 8, 11
  • 34. Browser Dom View Model Tuesday, November 8, 11
  • 35. Browser Dom View Model Tuesday, November 8, 11
  • 36. Browser Dom View Model Tuesday, November 8, 11
  • 38. var object = {}; $.extend(object, Backbone.Events); object.bind('eventName', function() { console.log('1'); }); object.bind('eventName', function() { console.log('2'); }); object.trigger('eventName'); // prints '1' and '2' Tuesday, November 8, 11
  • 39. var object = {}; $.extend(object, Backbone.Events); object.bind('eventName', function() { console.log('1'); }); object.bind('eventName', function() { console.log('2'); }); object.trigger('eventName'); // prints '1' and '2' Tuesday, November 8, 11
  • 40. var object = {}; $.extend(object, Backbone.Events); object.bind('eventName', function() { console.log('1'); }); object.bind('eventName', function() { console.log('2'); }); object.trigger('eventName'); // prints '1' and '2' Tuesday, November 8, 11
  • 41. var object = {}; $.extend(object, Backbone.Events); object.bind('eventName', function() { console.log('1'); }); object.bind('eventName', function() { console.log('2'); }); object.trigger('eventName'); // prints '1' and '2' Tuesday, November 8, 11
  • 42. var object = {}; $.extend(object, Backbone.Events); object.bind('eventName', function() { console.log('1'); }); object.bind('eventName', function() { console.log('2'); }); object.trigger('eventName'); // prints '1' and '2' Tuesday, November 8, 11
  • 44. var Person = Backbone.Model.extend({ initialize: function(){ console.log("I'm alive!"); } }); new Person(); Tuesday, November 8, 11
  • 45. var Person = Backbone.Model.extend({ initialize: function(){ console.log("I'm alive!"); } }); new Person(); Tuesday, November 8, 11
  • 46. var Person = Backbone.Model.extend({ initialize: function(){ console.log("I'm alive!"); } }); new Person(); Tuesday, November 8, 11
  • 47. var Person = Backbone.Model.extend({}); var me = new Person({name: 'Radoslav'}); me.get('name'); // Radoslav me.set({lastName: 'Stankov'}); me.get('lastName'); // Stankov Tuesday, November 8, 11
  • 48. var Person = Backbone.Model.extend({}); var me = new Person({name: 'Radoslav'}); me.get('name'); // Radoslav me.set({lastName: 'Stankov'}); me.get('lastName'); // Stankov Tuesday, November 8, 11
  • 49. var Person = Backbone.Model.extend({}); var me = new Person({name: 'Radoslav'}); me.get('name'); // Radoslav me.set({lastName: 'Stankov'}); me.get('lastName'); // Stankov Tuesday, November 8, 11
  • 50. var Person = Backbone.Model.extend({}); var me = new Person({name: 'Radoslav'}); me.get('name'); // Radoslav me.set({lastName: 'Stankov'}); me.get('lastName'); // Stankov Tuesday, November 8, 11
  • 51. var Person = Backbone.Model.extend({}); var me = new Person({name: 'Radoslav'}); me.get('name'); // Radoslav me.set({lastName: 'Stankov'}); me.get('lastName'); // Stankov Tuesday, November 8, 11
  • 52. var Person = Backbone.Model.extend({ defaults: { name: 'John', lastName: 'Doe', } }); var me = new Person(); me.get('name'); // John me.get('lastName'); // Doe Tuesday, November 8, 11
  • 53. var Person = Backbone.Model.extend({ defaults: { name: 'John', lastName: 'Doe', } }); var me = new Person(); me.get('name'); // John me.get('lastName'); // Doe Tuesday, November 8, 11
  • 54. var Person = Backbone.Model.extend({ defaults: { name: 'John', lastName: 'Doe', } }); var me = new Person(); me.get('name'); // John me.get('lastName'); // Doe Tuesday, November 8, 11
  • 55. var Person = Backbone.Model.extend({ defaults: { name: 'John', lastName: 'Doe', } }); var me = new Person(); me.get('name'); // John me.get('lastName'); // Doe Tuesday, November 8, 11
  • 56. var Calculator = Backbone.Model.extend({ defaults: { value: 0 }, value: function(){ return this.get('value'); }, sum: function(value){ this.set({value: value + this.get('value')}); }, reset: function(){ this.set({value: 0}); } }); Tuesday, November 8, 11
  • 57. var Calculator = Backbone.Model.extend({ defaults: { value: 0 }, value: function(){ return this.get('value'); }, sum: function(value){ this.set({value: value + this.get('value')}); }, reset: function(){ this.set({value: 0}); } }); Tuesday, November 8, 11
  • 58. var Calculator = Backbone.Model.extend({ defaults: { value: 0 }, value: function(){ return this.get('value'); }, sum: function(value){ this.set({value: value + this.get('value')}); }, reset: function(){ this.set({value: 0}); } }); Tuesday, November 8, 11
  • 59. var Calculator = Backbone.Model.extend({ defaults: { value: 0 }, value: function(){ return this.get('value'); }, sum: function(value){ this.set({value: value + this.get('value')}); }, reset: function(){ this.set({value: 0}); } }); Tuesday, November 8, 11
  • 60. var Calculator = Backbone.Model.extend({ defaults: { value: 0 }, value: function(){ return this.get('value'); }, sum: function(value){ this.set({value: value + this.get('value')}); }, reset: function(){ this.set({value: 0}); } }); Tuesday, November 8, 11
  • 61. var cal = new Calculator(); cal.bind('change:value', function(model, value){ console.log(value); }); cal.bind('change', function(model){ console.log(model.get('value')); }); cal.bind('all', function(eventName) { console.log('I see every thing!', eventName); }); Tuesday, November 8, 11
  • 62. var cal = new Calculator(); cal.bind('change:value', function(model, value){ console.log(value); }); cal.bind('change', function(model){ console.log(model.get('value')); }); cal.bind('all', function(eventName) { console.log('I see every thing!', eventName); }); Tuesday, November 8, 11
  • 63. var cal = new Calculator(); cal.bind('change:value', function(model, value){ console.log(value); }); cal.bind('change', function(model){ console.log(model.get('value')); }); cal.bind('all', function(eventName) { console.log('I see every thing!', eventName); }); Tuesday, November 8, 11
  • 64. var cal = new Calculator(); cal.bind('change:value', function(model, value){ console.log(value); }); cal.bind('change', function(model){ console.log(model.get('value')); }); cal.bind('all', function(eventName) { console.log('I see every thing!', eventName); }); Tuesday, November 8, 11
  • 65. var cal = new Calculator(); cal.bind('myEvent', function(){ console.log('KaBoom....'); }); cal.trigger('myEvent'); Tuesday, November 8, 11
  • 66. var Product = Backbone.Model.extend({ urlRoot: '/products' }); var chair = new Product({ name: 'chair', price: 10 }); chair.save(); // POST /products Tuesday, November 8, 11
  • 67. var Product = Backbone.Model.extend({ url: function(){ return '/products/' + (this.isNew() ? '' : this.id); } }); var chair = new Product({ id: 5, name: 'chair', price: 10 }); chair.save(); // PUT /products/1 Tuesday, November 8, 11
  • 69. И още... • validate • escape • has • unset • clear • hasChanged • changedAttributes • previousAttributes • fetch • toJSON • clone Tuesday, November 8, 11
  • 72. var UserNameView = Backbone.View.extend({ tagName: 'input', className: 'string optional', id: 'user-name', attributes: { type: 'string', name: 'user[name]' } }); var userName = new UserNameView(); console.log(userName.el); <input type="string" name="user[name]" id="user-name" class="string optional"> Tuesday, November 8, 11
  • 73. var UserNameView = Backbone.View.extend({ tagName: 'input', className: 'string optional', id: 'user-name', attributes: { type: 'string', name: 'user[name]' } }); var userName = new UserNameView(); console.log(userName.el); <input type="string" name="user[name]" id="user-name" class="string optional"> Tuesday, November 8, 11
  • 74. var UserNameView = Backbone.View.extend({ tagName: 'input', className: 'string optional', id: 'user-name', attributes: { type: 'string', name: 'user[name]' } }); var userName = new UserNameView(); console.log(userName.el); <input type="string" name="user[name]" id="user-name" class="string optional"> Tuesday, November 8, 11
  • 75. var UserNameView = Backbone.View.extend({ tagName: 'input', className: 'string optional', id: 'user-name', attributes: { type: 'string', name: 'user[name]' } }); var userName = new UserNameView(); console.log(userName.el); <input type="string" name="user[name]" id="user-name" class="string optional"> Tuesday, November 8, 11
  • 76. var UserNameView = Backbone.View.extend({ tagName: 'input', className: 'string optional', id: 'user-name', attributes: { type: 'string', name: 'user[name]' } }); var userName = new UserNameView(); console.log(userName.el); <input type="string" name="user[name]" id="user-name" class="string optional"> Tuesday, November 8, 11
  • 77. var UserNameView = Backbone.View.extend({ tagName: 'input', className: 'string optional', id: 'user-name', attributes: { type: 'string', name: 'user[name]' } }); var userName = new UserNameView(); console.log(userName.el); <input type="string" name="user[name]" id="user-name" class="string optional"> Tuesday, November 8, 11
  • 78. var UserNameView = Backbone.View.extend({ tagName: 'input', className: 'string optional', id: 'user-name', attributes: { type: 'string', name: 'user[name]' } }); var userName = new UserNameView(); console.log(userName.el); <input type="string" name="user[name]" id="user-name" class="string optional"> Tuesday, November 8, 11
  • 79. var UsersListView = Backbone.View.extend({ el: '#users-list' }); var userList = new UsersListView(); console.log(userList.el); Tuesday, November 8, 11
  • 80. var EditBoxView = Backbone.View.extend({}); var element = $('#edit-box-view').get(0), editBox = new EditBoxView({el: element}); console.log(editBox.el === element); Tuesday, November 8, 11
  • 81. var DocumentView = Backbone.View.extend({ events: { 'dblclick': 'open', 'click .grid .doc': 'select', 'customEvent .title': 'custom' }, open: function() {}, select: function() {}, custom: function() {} }); Tuesday, November 8, 11
  • 82. var DocumentView = Backbone.View.extend({ events: { 'dblclick': 'open', 'click .grid .doc': 'select', 'customEvent .title': 'custom' }, open: function() {}, select: function() {}, custom: function() {} }); Tuesday, November 8, 11
  • 83. var DocumentView = Backbone.View.extend({ events: { 'dblclick': 'open', 'click .grid .doc': 'select', 'customEvent .title': 'custom' }, open: function() {}, select: function() {}, custom: function() {} }); Tuesday, November 8, 11
  • 84. var DocumentView = Backbone.View.extend({ events: { 'dblclick': 'open', 'click .grid .doc': 'select', 'customEvent .title': 'custom' }, open: function() {}, select: function() {}, custom: function() {} }); Tuesday, November 8, 11
  • 85. var DocumentView = Backbone.View.extend({ events: { 'dblclick': 'open', 'click .grid .doc': 'select', 'customEvent .title': 'custom' }, open: function() {}, select: function() {}, custom: function() {} }); Tuesday, November 8, 11
  • 86. var DocumentView = Backbone.View.extend({ events: { 'dblclick': 'open', 'click .grid .doc': 'select', 'customEvent .title': 'custom' }, open: function() {}, select: function() {}, custom: function() {} }); Tuesday, November 8, 11
  • 87. var DocumentView = Backbone.View.extend({ events: { 'dblclick': 'open', 'click .grid .doc': 'select', 'customEvent .title': 'custom' }, open: function() {}, select: function() {}, custom: function() {} }); Tuesday, November 8, 11
  • 88. <script type="text/template" id="news"> <h1><%= title %></h1> <time><%= created_at %></time> <p><%= text %></p> </script> Tuesday, November 8, 11
  • 89. var NewsView = Backbone.View.extend({ template: _.template($('#news').html()), render: function() { this.el.innerHTML = this.template(this.model); return this; } }); Tuesday, November 8, 11
  • 90. var view = new NewsView({ model: { title: "News Title", created_at: "Today", text: "Long text" } }); document.body.appendChild(view.render().el); Tuesday, November 8, 11
  • 91. <script type="text/template" id="news"> <h1><%= title %></h1> <time><%= created_at %></time> <p><%= text %></p> </script> Tuesday, November 8, 11
  • 92. <div> <h1>News Title</h1> <time>Today</time> <p>Long text</p> </div> Tuesday, November 8, 11
  • 93. View Model DOM Tuesday, November 8, 11
  • 94. View Model DOM Tuesday, November 8, 11
  • 95. View Model DOM Tuesday, November 8, 11
  • 96. View Model DOM Tuesday, November 8, 11
  • 97. View Model DOM Tuesday, November 8, 11
  • 98. View Model DOM Tuesday, November 8, 11
  • 99. View Model DOM Tuesday, November 8, 11
  • 100. View Model DOM Tuesday, November 8, 11
  • 101. View Model DOM Tuesday, November 8, 11
  • 102. View Model DOM Tuesday, November 8, 11
  • 103. View Model DOM View 2 Tuesday, November 8, 11
  • 104. View Model DOM View 2 Tuesday, November 8, 11
  • 105. View Model DOM View 2 Tuesday, November 8, 11
  • 106. View Model DOM View 2 Tuesday, November 8, 11
  • 107. View Model DOM View 2 Tuesday, November 8, 11
  • 108. View Model DOM View 2 Tuesday, November 8, 11
  • 109. View Model DOM View 2 Tuesday, November 8, 11
  • 110. View Model DOM View 2 Tuesday, November 8, 11
  • 111. View Model DOM View 2 Tuesday, November 8, 11
  • 112. View Model DOM View 2 Tuesday, November 8, 11
  • 113. View View 2 Model DOM Tuesday, November 8, 11
  • 114. View View 2 Model DOM View 3 Tuesday, November 8, 11
  • 115. View View 2 Model DOM View 3 View 4 Tuesday, November 8, 11
  • 116. View View 2 Model DOM View 3 View 4 View .. N Tuesday, November 8, 11
  • 117. View View 2 Model DOM View 3 View 4 View .. N Tuesday, November 8, 11
  • 118. View View 2 Model DOM View 3 View 4 View .. N Tuesday, November 8, 11
  • 119. View View 2 Model DOM View 3 View 4 View .. N Tuesday, November 8, 11
  • 120. View View 2 Model DOM View 3 View 4 View .. N Tuesday, November 8, 11
  • 121. View View 2 Model DOM View 3 View 4 View .. N Tuesday, November 8, 11
  • 122. View View 2 Model DOM View 3 View 4 View .. N Tuesday, November 8, 11
  • 123. View View 2 Model DOM View 3 View 4 View .. N Tuesday, November 8, 11
  • 124. View View 2 Model DOM View 3 View 4 View .. N Tuesday, November 8, 11
  • 126. var Calculator = Backbone.Model.extend({ defaults: { value: 0 }, increment: function() { this.set({'value': this.get('value') + 1}); }, decrement: function() { this.set({'value': this.get('value') - 1}); }, getValue: function() { return this.get('value'); } }); Tuesday, November 8, 11
  • 127. var ButtonsView = Backbone.View.extend({ events: { 'click .plus': 'plus', 'click .minus': 'minus' }, plus: function() { this.model.increment(); }, minus: function() { this.model.decrement(); } }); Tuesday, November 8, 11
  • 128. var DisplayView = Backbone.View.extend({ initialize: function() { this.model.bind('change:value', this.render, this); this.render(); }, render: function() { this.el.innerHTML = this.model.getValue(); return this; } }); Tuesday, November 8, 11
  • 129. var cal = new Calculator(); new ButtonsView({model: cal, el: '.buttons'}); new DisplayView({model: cal, el: '.display'}); Tuesday, November 8, 11
  • 131. var ProductsCollection = Backbone.Collection.extend({ model: Product }); var products = new ProductsCollection(); products.fetch(); products.bind('reset', function(list) { console.log('Loaded', list.length, 'records'); }); Tuesday, November 8, 11
  • 132. products.bind('add', function(model) { console.log('new product added'); }); products.bind('remove', function(model) { console.log('item product removed'); }); Tuesday, November 8, 11
  • 133. И още... • Underscore Methods • add / remove / at • sort / comparator • reset • create • url • toJSON Tuesday, November 8, 11
  • 136. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 137. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 138. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 139. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 140. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 141. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 142. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 143. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 144. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 145. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 146. var AppRouter = Backbone.Router.extend({ routes: { 'pages': 'index', 'pages/search/:q': 'search', 'pages/:id': 'show' }, initialize: function() { console.log('initialize'); }, index: function() { /* code */ }, search: function(query) { /* code */ }, show: function(id) { /* code */ } }); var app = new AppRouter(); Backbone.history.start(); Tuesday, November 8, 11
  • 147. app.navigate('pages', true); app.navigate('pages/search/title', true); app.navigate('pages/3', true); Tuesday, November 8, 11
  • 148. site.com/path#pages site.com/path#pages/search/title site.com/path#pages/3 Tuesday, November 8, 11
  • 151. site.com/path#pages site.com/path#pages/search/title site.com/path#pages/3 Tuesday, November 8, 11
  • 152. site.com/path/pages site.com/path/pages/search/title site.com/path/pages/3 Tuesday, November 8, 11
  • 166. Благодаря за вниманието @rstankov Tuesday, November 8, 11