Atlas* is an extension for Backbone. It provides improved Model
and Collection
classes for
easier manipulation of nested resources, filters and custom headers.
*In anatomy, the atlas is the first cervical vertebra of the spine.
Install as node module.
npm install --save backbone.atlas
import Atlas from "backbone.atlas";
To use all Atlas features, application models and collections must extend Atlas' instead of Backbone's.
const ExampleModel = Atlas.Model.extend(protoProps);
const ExampleCollection = Atlas.Collection.extend(protoProps);
Atlas uses initialize
method to assign options like parent
and filters
. If initialize
method is implemented,
super initialize
must be called.
const ExampleModel = Atlas.Model.extend({
initialize(attributes, options) {
Atlas.Model.prototype.initialize.call(this, attributes, options);
// Additional initialization
}
});
const ExampleCollection = Collection.extend({
baseModel: User,
model(attributes, options) {
switch (attributes.type) {
case "1":
return new Seller(attributes, options);
case "2":
return new Traveler(attributes, options);
default:
return new this.baseModel(attributes, options);
}
}
});
NOTE: Collection's url()
and sync()
methods check model.prototype
to determine urlRoot
and headers
. Specify baseModel
for polymorphic collections.
Resources are nested by specifying parent
option when instantiating model ot collection.
const User = Atlas.Model.extend({
urlRoot: "/users",
});
const Preference = Atlas.Model.extend({
urlRoot: "/preferences"
});
const Preferences = Atlas.Collection.extend({
model: Preference
});
let user = new User({ id: 1 });
let preferences = new Preferences([], { parent: user });
preferences.fetch(); // Will fetch from `/user/1/preferences`
NOTE: Atlas uses url()
method to return nested urls. There is rarely a need to override this method.
Query parameters can easily be manipulated with filters
option.
const Product = Atlas.Model.extend({
urlRoot: "/products"
});
const Products = Atlas.Collection.extend({
model: Product
});
let computers = new Products([], {
filters: {
type: "computer"
}
});
computers.fetch(); // Will fetch from `/products?type=computer`
NOTE: Atlas uses fetch()
method to add filters. There is rarely a need to override this method.
Atlas uses static, per-attribute parsers to parse model attributes individually.
const Article = Atlas.Model.extend({}, {
parsers: {
published(value, options, model) {
return new Date(value);
}
}
});
let article = new Article({ published: "2018-09-28" }, { parse: true });
article.get("published"); // Returns a Date object
If a specific attribute parser is not defined, default attribute parser will be be called. Default parser can be overridden to provide a catch-all parser logic.
const Article = Atlas.Model.extend({}, {
parse(value, options, model, attribute) {
return value;
}
});
Request headers can easily be manipulated with headers
option.
Headers added this way will only affect instances of ExampleModel
and it's extending classes.
IMPORTANT: Headers are always set to Model
. Collection
will pickup headers from it's model
option.
const ExampleModel = Atlas.Model.extend({
headers: {
"X-Custom-Header": "Hello"
}
});
NOTE: Atlas uses sync()
method to add headers. There is rarely a need to override this method.