SyncableFromMultipleSourcesMixin
Simplifies implementing models and collections, which have to be fetched
by issuing multiple asynchronous calls. Either by executing multiple $.ajax
statements, or by feching multiple models or collections and merging their
content.
How to apply the mixin to a model
var MyModel = Backbone.Model.extend({
constructor: function MyModel(attributes, options) {
Backbone.Model.prototype.constructor.apply(this, arguments);
this.makeSyncableFromMultipleSources(options);
},
sync: function (method, model, options) {
return this.syncFromMultipleSources(
[...promises], this._mergeSources,
this._convertError, options);
},
_mergeSources: function (...results) {
return merged response;
},
_convertError: function (result) {
return {
status: ...,
statusText: '...',
responseJSON: ...
};
}
});
SyncableFromMultipleSources.mixin(MyModel.prototype);
How to combine multiple $.ajax
calls
sync: function (method, model, options) {
var first = $.ajax(this.connector.extendAjaxOptions({
url: '...'
})
.then(function (response) {
return response;
}),
second = $.ajax(this.connector.extendAjaxOptions({
url: '...'
})
.then(function (response) {
return response;
});
return this.syncFromMultipleSources(
[first, second], this._mergeSources, options);
},
_mergeSources: function (first, second) {
return merged response to be parsed;
}
How to combine multiple model/collection fetches
sync: function (method, model, options) {
var first = new FirstModel(...),
second = new SecondCollection(...);
first = first.fetch(options)
.then(function () {
return first.toJSON()
}),
second = second.fetch(options)
.then(function () {
return second.toJSON()
}),
options.parse = false;
return this.syncFromMultipleSources(
[first, second], this._mergeSources, options);
},
_mergeSources: function (first, second) {
return already parsed merged response;
}
makeSyncableFromMultipleSources(options) : this
Must be called in the constructor to initialize the mixin functionality. Expects the Backbone.Model or Backbone.Collection constructor options passed in.
syncFromMultipleSources(promises, mergeSources, convertError, options) : promise
Implements the interface (events, callbacks and promise) of Backbone.sync
by waiting on the source promises and by resolving the target promise with
the merged response returned by the caller's callback, which receives results
of the source promises to merge them.
If one of the source promises fails, the rejected result will be passed
to convertError
, which is an optional parameter. (A function expecting
rejected result from $.ajax will be used by default.) If specified, it
has to return an object simulating the jQuery AJAX object:
{
statusText: '...',
responseJSON: {...}
}