Anton Shestakov <av6@dwimlabs.net>, Wed, 10 Aug 2016 22:27:30 +0800
fruitbar: it's a todo app, one word
static/js/backbone.shard.js
Permissions: -rw-r--r--
* (c) 2013, 2016 Anton Shestakov. * This extension to Backbone may be freely distributed * https://opensource.org/licenses/MIT Backbone.Shard = function(options) { this._collection = options.collection; this._filter = options.filter; this.models = this._collection.filter(this._filter); .on('all', function(event, model) { if (this._filter(model) && _(this.models).contains(model)) { this.trigger.apply(this, arguments); if (this._filter(model) && !_(this.models).contains(model)) { this.trigger('add', model); if (!this._filter(model) && _(this.models).contains(model)) { this.models = _.without(this.models, model); this.trigger('remove', model); } else if (/^change:/.test(event) && this._filter(model) && _(this.models).contains(model)) { this.trigger.apply(this, arguments); .on('add', function(model) { if (this._filter(model) && !_(this.models).contains(model)) { this.trigger('add', model); .on('remove', function(model) { if (this._filter(model) && _(this.models).contains(model)) { this.models = _.without(this.models, model); this.trigger('remove', model); .on('reset', function() { this.models = this._collection.filter(this._filter); this.initialize.apply(this, arguments); _.extend(Backbone.Shard.prototype, Backbone.Events, { initialize: function() {}, return _.map(this.models, function(model) { return model.get(attr); }); // Underscore methods that we want to implement on the Shard. 'all', 'any', 'chain', 'collect', 'contains', 'detect', 'difference', 'drop', 'each', 'every', 'filter', 'find', 'findIndex', 'findLastIndex', 'first', 'foldl', 'foldr', 'forEach', 'head', 'include', 'includes', 'indexOf', 'initial', 'inject', 'invoke', 'isEmpty', 'last', 'lastIndexOf', 'map', 'max', 'min', 'reduce', 'reduceRight', 'reject', 'rest', 'sample', 'select', 'shuffle', 'size', 'some', 'tail', 'take', 'toArray', 'without' // Mix in each Underscore method as a proxy to `Shard#models`. _.each(methods, function(method) { Backbone.Shard.prototype[method] = function() { var args = Array.prototype.slice.call(arguments); args.unshift(this.models); return _[method].apply(_, args); // Underscore methods that take a property name as an argument. var attributeMethods = ['countBy', 'groupBy', 'indexBy', 'sortBy']; // Use attributes instead of properties. _.each(attributeMethods, function(method) { Backbone.Shard.prototype[method] = function(value, context) { var iterator = _.isFunction(value) ? value : function(model) { return _[method](this.models, iterator, context);