Skip to content

Latest commit

 

History

History
180 lines (129 loc) · 3.87 KB

backbone.md

File metadata and controls

180 lines (129 loc) · 3.87 KB

title: Backbone.js

Binding events

.on('event', callback);
.on('event', callback, context);

.on({
  'event1': callback,
  'event2': callback
});

.on('all', callback);

.once('event', callback);   /* Only happens once */

Unbinding events

object.off("change", onChange);    // just the `onChange` callback
object.off("change");              // all "change" callbacks
object.off(null, onChange);        // `onChange` callback for all events
object.off(null, null, context);   // all callbacks for `context` all events
object.off();                      // all

Events

object.trigger('event')

view.listenTo(object, event, callback)
view.stopListening()

List of events

  • Collection:

    • add (model, collection, options)
    • remove (model, collection, options)
    • reset (collection, options)
    • sort (collection, options)
  • Model:

    • change (model, options)
    • change:[attr] (model, value, options)
    • destroy (model, collection, options)
    • error (model, xhr, options)
  • Model and collection:

    • request (model, xhr, options)
    • sync (model, resp, options)
  • Router:

    • route:[name] (params)
    • route (router, route, params)

Views

// All attributes are optional
var View = Backbone.View.extend({
  model: doc,

  tagName: 'div',
  className: 'document-item',
  id: "document-" + doc.id,
  attributes: { href: '#' },

  el: 'body',

  events: {
    'click button.save': 'save',
    'click .cancel': function() { ... },
    'click': 'onclick'
  },

  constructor: function() { ... },
  render: function() { ... }
});

view = new View();
view = new View({ el: ... });

view.$el.show();
view.$("input");

view.remove();

view.delegateEvents();
view.undelegateEvents();

Model

// All attributes are optional
var Model = Backbone.Model.extend({
  defaults: {
    'author': 'unknown'
  },
  idAttribute: '_id',
  parse: function() {
  }
});

var obj = new Model({ title: "Lolita", author: "Nabokov" });

var obj = new Model({ collection: ... });

obj.id
obj.cid   //=> "c38" (client-side ID)

obj.clone()

obj.hasChanged('title')
obj.changedAttributes()  /* false, or hash */
obj.previousAttributes() /* false, or hash */
obj.previous('title')

obj.isNew()

obj.set({ title: 'A Study in Pink' });
obj.set({ title: 'A Study in Pink' }, { validate: true, silent: true });
obj.unset('title')

obj.get('title')
obj.has('title')
obj.escape('title')     /* Like .get() but HTML-escaped */

obj.clear()
obj.clear({ silent: true })

obj.save()
obj.save({ attributes })
obj.save(null, {
  silent: true, patch: true, wait: true,
  success: callback, error: callback
})

obj.destroy()
obj.destroy({
  wait: true,
  success: callback, error: callback
})

obj.toJSON()

obj.fetch()
obj.fetch({ success: callback, error: callback })

Model: validation

var Model = Backbone.Model.extend({
  validate: function(attrs, options) {
    if (attrs.end < attrs.start) {
      return "Can't end before it starts";
    }
  }
});

obj.validationError  //=> "Can't end before it starts"
obj.isValid()
obj.on('invalid', function(model, error) { ... })

// Triggered on:
obj.save()
obj.set({...}, { validate: true })

Model: custom URLs

var Model = Backbone.Model.extend({
  // Single URL (string or function)
  url: '/account',
  url: function() { return '/account'; },

  // Both of these two work the same way
  url: function() { return '/books/' + this.id }),
  urlRoot: '/books'
});

var obj = new Model({ url: ... });
var obj = new Model({ urlRoot: ... });