dom.forEachChildEl(el, function(childEl) { if (childEl.id) { var descendentWidget = widgets.get(childEl.id); if (descendentWidget) { _destroy(descendentWidget, false, false); } } walkDOM(childEl); });
_destroy = function(widget, removeNode, recursive) { var message = { widget: widget }, rootEl = widget.getEl(), widgets = require('raptor/widgets'), assignedId = widget._assignedId; widget.publish('beforeDestroy', message); widget.__destroyed = true; if (rootEl) { if (recursive) { var walkDOM = function(el) { dom.forEachChildEl(el, function(childEl) { if (childEl.id) { var descendentWidget = widgets.get(childEl.id); if (descendentWidget) { _destroy(descendentWidget, false, false); } } walkDOM(childEl); }); }; walkDOM(rootEl); } if (removeNode && rootEl.parentNode) { //Remove the widget's DOM nodes from the DOM tree if the root element is known rootEl.parentNode.removeChild(rootEl); } } widgets._remove(widget._id); if (assignedId) { var scopeWidget = widgets.get(widget._scope); if (scopeWidget) { scopeWidget.widgets._remove(widget, assignedId); } } widget.publish('destroy', message); // Have the widget unsubscribe from any messages that is currently subscribed to // Unsubscribe all messages after publishing "destroy" otherwise the widget might not get that event listeners.unsubscribeFromAll(widget); },