konishi-backbone-schema v1.0.0
Backbone.Schema
This plugin allow you define schemas for your models. It provides type control, computable properties, references between models and collections, filters and localization.
Dependencies:
- Backbone
>= 1.1.0 - Underscore
>= 1.5.2 - Moment
>= 2.8.3
Getting Started
Create model and schema
First you need to define model and schema.
var model = new Backbone.Model(), schema = new Backbone.Schema(model);Define properties
Now you got instances of model and schema and you can start defining properties of the model. Use schema.define(attribute, options) method to do it.
Option type
Type string
Converts value to string. Represents as is.
schema.define('string-property', { type: 'string' });
model.set('string-property', 999999.99); // --> "999999.99"
model.get('string-property'); // <-- "999999.99"Type boolean
Converts value to boolean. Represents as is.
schema.define('boolean-property', { type: 'boolean' });
model.set('boolean-property', 'true'); // --> true
model.get('boolean-property'); // <-- trueType number
Converts value to number. Represents as is.
schema.define('number-property', { type: 'number' });
model.set('number-property', '999999.99'); // --> 999999.99
model.get('number-property'); // <-- 999999.99Type datetime
Converts value to Date, ISO 8601, or Unix time. Represents as is, or as formatted string (depends from option format).
Additional options:
format- see more about moment formattingstandard(available values areisoandunix) - defines in which way date will be stored in the model (if not specified, date will be stored as Date)
schema.define('datetime-property', { type: 'datetime', format: 'YYYY-MM-DD', standard: 'unix' });
model.set('datetime-property', new Date('2014/10/23')); // --> 1413993600
model.get('datetime-property'); // <-- "2014-10-23"Define properties of array type
Option array
Besides listed above data types you can define arrays. To do this just use option array instead of type. For example: { array: 'string' }, { array: 'number' } etc. In this case each item in array will be processed by corresponding handler.
Define computed property
You can define a computed properties with your own custom logic.
Options getter and setter
Manipulate these two options to describe behavior of a computed property.
var User = Backbone.Model.extend({
initialize: function () {
var schema = new Backbone.Schema(this);
schema.define('fullName', {
getter: function (attribute, value) {
var firstName = this.model.get('firstName'),
lastName = this.model.get('lastName');
return firstName + ' ' + lastName;
},
setter: function (attribute, value) {
var fullName = value.match(/\S+/g);
return {
firstName: fullName[0],
lastName: fullName[1]
};
}
});
}
});var user = new User({
firstName: 'Dmytro',
lastName: 'Nemoga'
});
user.get('fullName'); // <-- "Dmytro Nemoga"
user.set('fullName', 'Andriy Serputko'); // --> firstName: "Andriy", lastName: "Serputko"Define nested models and collections
Option model
Converts value to model, using value as a set of attributes. Represents as is.
Additional options:
clear- iftrue, model removes an existing attributes before setting new (otherwise merges them)
schema.define('nested-model', { model: Backbone.Model });
model.set('nested-model', { id: 0, value: 'foo' }); // --> new Backbone.Model({ id: 0, value: 'foo' })
model.get('nested-model'); // <-- instance of Backbone.ModelOption collection
Converts value to collection, using value as a set of attributes. Represents as is.
Additional options:
reset- iftrue, collection removes an existing models before creating new (otherwise merges them)
schema.define('nested-collection', { collection: Backbone.Collection });
model.set('nested-collection', [ // --> new Backbone.Collection([
{ id: 1, value: 'bar' }, // { id: 1, value: 'bar' },
{ id: 2, value: 'baz' }, // { id: 2, value: 'baz' },
{ id: 3, value: 'qux' } // { id: 3, value: 'qux' }
]); // ])
model.get('nested-collection'); // <-- instance of Backbone.CollectionDefine reference models and collections
Before using reference models or collections make sure that you have a source collection.
var sourceCollection = new Backbone.Collection([
{ id: 0, value: 'foo' },
{ id: 1, value: 'bar' },
{ id: 2, value: 'baz' },
{ id: 3, value: 'qux' }
]);Option source
If you pass collection in this option, plugin tries to get model from it.
Type model
Converts value (a model ID in the source collection) to model, keeping reference to original model. Represents as is.
schema.define('reference-model', { type: 'model', source: sourceCollection });
model.set('reference-model', 0); // --> sourceCollection.get(0)
model.get('reference-model'); // <-- instance of Backbone.ModelType collection
Converts value (a set of model IDs in the source collection) to collection, keeping references to original models. Represents as is.
schema.define('reference-collection', { type: 'collection', source: sourceCollection });
model.set('reference-collection', [ // --> new Backbone.Collection([
1, // sourceCollection.get(1),
2, // sourceCollection.get(2),
3 // sourceCollection.get(3)
]); // ])
model.get('reference-collection'); // <-- instance of Backbone.CollectionKeeping integrity
The plugin prevents setting undefined values, instead of this it assigns a default value or null for regular properties, {} for models and [] for collections and arrays.
Changelog
0.5.1
- Fixed serious issue with
thiscontext
0.5.0
0.4.9
- Fixed issue with nested models and collections
0.4.8
Backbone.Schemacould be extended
0.4.7
- Added CommonJS support
0.4.6
- Removed
texttype numberanddatetimerequiresformatoption for string output
0.4.4
- Fixed behavior for
modelandcollectiontypes
0.4.3
- Renaming option
resettoclearformodeltype - Changed default behavior for
modelandcollectiontypes
0.4.1
- Renaming
typestohandlers - Method
refreshmoved from model to schema - Removed backward reference to schema
0.3.8
refreshaffects only registered attributesmodelandcollectionattributes cannot benull
0.3.6
- Option
arrayOfrenamed toarray - Option
fromSourcerenamed tosource
0.3.4
- Added option to use a custom culture
0.3.3
- Fixed serious issue with
modeltype
0.3.2
- Handlers
currencyandpercentmerged intonumber
0.3.1
- Plugin implemented as decorator, not a class
- Option
resetformodelandcollectiontypes
0.2.9
- Properties are configurable with additional options
- Formatters and converters merged into types
- Added support of reference models and collections
- A lot of fixes
0.2.5
- Added support of nested models and collections
0.2.4
- Support of arrays
- Added type
locale - Removed method
toJSON
0.2.1
- Formatters and converters takes only
valueargument
0.2.0
- Static methods runs in correct context, now they may be used as independent helpers
0.1.9
- Properties
formattersandconvertersis static
0.1.8
- Removed CommonJS support
0.1.7
- Added CommonJS support
0.1.6
- Integration with project Backbone.Accessors
- Method
definePropertyrenamed toproperty - Methods
addGetter/addSettermerged to methodcomputed - Option
advancedoftoJSONmethod renamed toschema
0.1.2
- Removed argument
optionsofdefinePropertymethod's
0.1.1
- Method
addPropertyrenamed todefineProperty
0.1.0
- Initial release
9 years ago



