jridgewell/minionette

View on GitHub
lib/minionette-min.js

Summary

Maintainability
A
0 mins
Test Coverage
"use strict";var Minionette=function(a,b){function c(a,b){if(null==a)return void 0;var c=a[b];if("function"==typeof c){var d=e.call(arguments,2);return c.apply(a,d)}return c}var d=b.Minionette={},e=Array.prototype.slice;return d.Region=function(a){a=a||{},this.cid=a.cid,this._ensureView(a)},d.Region.extend=b.View.extend,a.extend(d.Region.prototype,b.Events,{_ensureView:function(a){var c={el:a.el,tagName:"span",attributes:function(){return{"data-cid":this.cid}}};this._view=new b.View(c),this._view._selector=a.selector||"[data-cid="+this._view.cid+"]",this.view=a.view||this._view,this.view._parent=this},_ensureElement:function(c){var d,e=a.result(this._parent,"$el")||b.$();c.$el.parent().is(e)||(d=e.find(c._selector),c.setElement(d))},reset:function(a){return this.attach(this._view,a),this},render:function(){return this.view.render()},attach:function(a,b){var d=this.view,e=d.$el;return this.trigger("attach",a,this),this.view=a,a._parent=this,c(this._detachedView,"remove"),delete this._detachedView,e.is(a.$el)||(a.$el.insertAfter(e),e.detach(),b||d.remove()),this.trigger("attached",a,this),this},remove:function(){return this.trigger("remove",this),this._removeViews(),this._removeFromParent(),this.stopListening(),this.trigger("removed",this),this},_removeViews:function(){this.view.remove(),this._view.remove(),c(this._detachedView,"remove")},_removeFromParent:function(){c(this._parent,"_removeRegion",this)},detach:function(){var a=this.view;return a!==this._view&&(this.trigger("detach",a,this),this.reset(!0),this._detachedView=a,this.trigger("detached",a,this)),this},reattach:function(){if(this._ensureElement(this._view),this._detachedView){var a=this._detachedView;return delete this._detachedView,this.trigger("reattach",a,this),this.attach(a,!0),this.trigger("reattached",a,this),a}},_removeView:function(a){this.view===a&&this.reset(!0)}}),d.View=b.View.extend({constructor:function(d){a.extend(this,a.pick(d||{},"regions","Region","template")),this._regions={},b.View.apply(this,arguments),this.addRegions(c(this,"regions")),this._listenToEvents(this.model,c(this,"modelEvents")),this._listenToEvents(this.collection,c(this,"collectionEvents")),a.bindAll(this,"_viewHelper")},Region:d.Region,template:function(){return""},serialize:function(){return{}},_serialize:function(){return a.extend({view:this._viewHelper},this.serialize())},remove:function(){return this.trigger("remove",this),this._removeFromParent(),a.invoke(this._regions,"remove"),d.View.__super__.remove.apply(this,arguments),this.trigger("removed",this),this},render:function(){return this.trigger("render",this),a.invoke(this._regions,"detach"),this.$el.html(c(this,"template",this._serialize())),a.invoke(this._regions,"reattach"),this.trigger("rendered",this),this},addRegion:function(a,b){c(this._regions[a],"remove");var d={cid:a};!b||b.$el?d.view=b:(d.selector="object"==typeof b?b.selector:b,d.el=this.$(b));var e=new this.Region(d);return e._parent=this,this[e.cid]=this._regions[e.cid]=e,e},addRegions:function(b){return a.each(b,function(a,b){this.addRegion(b,a)},this),this},_removeFromParent:function(){c(this._parent,"_removeView",this)},_removeRegion:function(a){delete this[a.cid],delete this._regions[a.cid]},_listenToEvents:function(b,c){b&&a.each(c,function(a,c){"function"!=typeof a&&(a=this[a]),this.listenTo(b,c,a)},this)},_viewHelper:function(a){var b,c=this._regions[a]||this.addRegion(a);return(b=c.render().el)?b.outerHTML:""}}),d.ModelView=d.View.extend({modelEvents:{change:"render",destroy:"remove"},serialize:function(){return this.model.attributes}}),d.CollectionView=d.View.extend({constructor:function(a){this._modelViews={},this._ensureModelView(a||{}),d.View.apply(this,arguments),this.on("rendered",this._renderModelViews),this.on("removed",this._removeModelViews)},collectionEvents:{add:"addOne",remove:"removeOne",reset:"render",sort:"render"},modelViewEventPrefix:"modelView",ModelView:d.ModelView,render:function(){return this.once("render",function(){this.$el.empty(),this._removeModelViews()},this),d.CollectionView.__super__.render.apply(this)},_renderModelViews:function(){var a=new b.View({el:document.createDocumentFragment()}),c=this.appendModelView;this.appendModelView=function(b){a.el.appendChild(b.el)},this.collection.each(this.addOne,this),this.appendModelView=c,this.appendModelView(a)},appendModelView:function(a){this.$el.append(a.$el)},addOne:function(a){var b=this.buildModelView(a);return this._forwardEvents(b),this._modelViews[a.cid]=b,b._parent=this,this.trigger("addOne",b,this),this.appendModelView(b.render()),this.trigger("addedOne",b,this),b},buildModelView:function(a){return new this.ModelView({model:a})},removeOne:function(a){var b=this._modelViews[a.cid];return b&&(this.trigger("removeOne",b,this),b.remove(),this.trigger("removedOne",b,this),this.stopListening(b)),b},_removeView:function(a){delete this._modelViews[a.model.cid]},_removeModelViews:function(){a.invoke(this._modelViews,"remove")},_ensureModelView:function(a){var b=a.ModelView||this.ModelView||{};"function"!=typeof b&&(b=d.ModelView.extend(b)),this.ModelView=b},_forwardEvents:function(a){this.listenTo(a,"all",function(){var b=e.call(arguments),d=c(this,"modelViewEventPrefix");d=d?d+":":"",b[0]=d+b[0],b.push(a),this.trigger.apply(this,b)})}}),d}(_,Backbone);