Skip to content
This repository

Simple plugin/addon functionality for Backbone Views, Models, and Collections.

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 spec
Octocat-spinner-32 src
Octocat-spinner-32 vendor
Octocat-spinner-32 .gitignore
Octocat-spinner-32 .travis.yml
Octocat-spinner-32 README.md
Octocat-spinner-32 grunt.js
Octocat-spinner-32 package.json
README.md

Backbone.Augment

Build Status

Simple extension to add addon-like functionality to Backbone objects (Views, Models, Collections)

Why?

The best plugin architectures offer maximum flexibility around a simple, organized specification. Augment offers unrestrained functionality around a simple plugin and implementation signature.

Backbone itself includes extend() and the developers seem unwilling to allow intuitive access up the inheritance chain. This is entirely up to them but many still consider that valid usage. Augment allows that and more.

The benefit of augments is that their design keeps the implementing object in its scope allowing you to write extensible, chainable, and reusable augments without knowing what is being augmented.

Have you ever seen code in Backbone like :

var SomeView = Backbone.View.extend({
  someMethod : function(){}
});

var SomeChildView = SomeView.extend({
  someMethod : function(){
    SomeView.prototype.someMethod.apply(this, arguments);
  }
})

The problem shown is that your extensions need to know what they are extending. There have been numerous pull requests for Backbone that attempt to solve this in easier, more intuitive ways but the developers are reluctant to expose this functionality.

How do you use augments with Backbone?

Normal backbone extend

var NewView = Backbone.View.extend({ /* new stuff */});

Using augment

var NewView = Backbone.View.augment(augment1, augment2, etc);

Augment with extend

var NewView = Backbone.View
                .augment(augment1, augment2, etc)
                .extend( /* normal extend */ );

Augments are called in order and convention dictates that they return the new backbone object. This is convention and entirely up to the implementer

What do augments look like?

Augments are simple objects that include, at a minimum, an augment method.

An identity augment

This is an augment that doesn't do anything

var augment = {
  augment : function(OriginalObject) {
    return OriginalObject;
  }
}

A simple augment that calls its parent's render method

var augment = {
  augment : function(ImplementingView) {
    return ImplementingView.extend({
      render : function() {
        ImplementingView.prototype.render.apply(this,arguments);
      }
    });
  }
}

"But wait, that looks like the example you were trying to avoid..."

The important difference is that your implementing augmenter is passed in as an argument, meaning we don't know where we're being used. This is an important abstraction point that encourages much more reusable code.

Not just an inverted extend()

An augment's sole requirement is that it includes an augment() method. This allows you free reign to do whatever you might want. The original use case was to provide additional extend() functionality but that is up to you.

License

All code licensed under the MIT license.

Author

Written by Jarrod Overson

Something went wrong with that request. Please try again.