diff --git a/src/canvas/model/Frame.js b/src/canvas/model/Frame.js index 4dfcbeb2f..06e05328c 100644 --- a/src/canvas/model/Frame.js +++ b/src/canvas/model/Frame.js @@ -44,8 +44,6 @@ export default Model.extend({ !props.width && this.set(keyAutoW, 1); !props.height && this.set(keyAutoH, 1); - - this.getComponent()._initUm(); }, changesUp: debounce(function(opt = {}) { diff --git a/src/dom_components/model/Component.js b/src/dom_components/model/Component.js index 3721e6bb9..b1ae2e201 100644 --- a/src/dom_components/model/Component.js +++ b/src/dom_components/model/Component.js @@ -208,17 +208,31 @@ const Component = Backbone.Model.extend(Styleable).extend( }); if (!opt.temporary) { + this.__postAdd(); this.init(); this.__isSymbolOrInst() && this.__initSymb(); em && em.trigger('component:create', this); } }, - _initUm() { + __postAdd(opts = {}) { const um = this.em.get('UndoManager'); - if (!um) return; - um.add(this); - um.add(this.components()); + const comps = this.components(); + if (um && !this.__hasUm) { + um.add(this); + um.add(comps); + this.__hasUm = 1; + } + opts.recursive && comps.map(c => c.__postAdd(opts)); + }, + + __postRemove() { + const um = this.em.get('UndoManager'); + if (um) { + um.remove(this); + um.remove(this.components()); + delete this.__hasUm; + } }, __onChange(m, opts) { diff --git a/src/dom_components/model/Components.js b/src/dom_components/model/Components.js index 498263631..14d14e461 100644 --- a/src/dom_components/model/Components.js +++ b/src/dom_components/model/Components.js @@ -97,12 +97,10 @@ export default Backbone.Collection.extend({ // Remove stuff registered in DomComponents.handleChanges const inner = removed.components(); - const um = em.get('UndoManager'); em.stopListening(inner); em.stopListening(removed); em.stopListening(removed.get('classes')); - um.remove(removed); - um.remove(inner); + removed.__postRemove(); }, model(attrs, options) { @@ -252,7 +250,8 @@ export default Backbone.Collection.extend({ model.setStyle({}); model.addClass(name); } - model._initUm(); + + model.__postAdd({ recursive: 1 }); this.__onAddEnd(); },