dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
95 lines (82 loc) • 3.21 kB
JavaScript
define(["dojo/_base/lang","dojo/_base/declare", "dojo/Deferred", "dojo/_base/array", "dojo/dom-construct", "dijit/registry", "dojox/app/Controller"],
function(lang, declare, Deferred, array, domConstruct, registry, Controller){
// module:
// dojox/app/tests/domOrderByConstraint/controllers/UnloadViewController
// summary:
// Used to Unload Views when they are no longer needed
// Bind "unload-view" event on dojox/app application instance.
// Do transition from one view to another view.
return declare("dojox/app/tests/domOrderByConstraint/controllers/UnloadViewController", Controller, {
constructor: function(app){
this.app = app;
// summary:
// bind "app-transition" event on application instance.
//
// app:
// dojox/app application instance.
// events:
// {event : handler}
this.events = {
"unload-view": this.unloadView
};
},
unloadView: function(event){
// summary:
// Response to dojox/app "unload-view" event.
// If a view has children loaded the view and any children of the child will be unloaded.
//
// example:
// Use trigger() to trigger "unload-view" event, and this function will response the event. For example:
// | this.trigger("unload-view", {"parent":parent, "view":view, "callback":function(){...}});
//
// event: Object
// unloadView event parameter. It should be like this: {"parent":parent, "view":view, "callback":function(){...}}
var parent = event.parent || this.app;
var view = event.view || "";
var viewId = view.id;
if(!parent || !view || !viewId){
console.warn("unload-view event for view with no parent or with an invalid view with view = ", view);
return;
}
if(parent.selectedChildren[viewId]){
console.warn("unload-view event for a view which is still in use so it can not be unloaded for view id = " + viewId + "'.");
return;
}
if(!parent.children[viewId]){
console.warn("unload-view event for a view which was not found in parent.children[viewId] for viewId = " + viewId + "'.");
return;
}
this.unloadChild(parent, view);
// call Load event callback
if(event.callback){
event.callback();
}
},
unloadChild: function(parent, viewToUnload){
// summary:
// Unload the view, and all of its child views recursively.
// Destroy all children, destroy all widgets, destroy the domNode, remove the view from the parent.children,
// then destroy the view.
//
// parent: Object
// parent of this view.
// viewToUnload: Object
// the view to be unloaded.
for(var child in viewToUnload.children){
this.unloadChild(viewToUnload, child); // unload children then unload the view itself
}
if(viewToUnload.domNode){
// destroy all widgets, then destroy the domNode, then destroy the view.
var widList = registry.findWidgets(viewToUnload.domNode);
for(var wid in widList){
widList[wid].destroyRecursive();
}
domConstruct.destroy(viewToUnload.domNode);
}
delete parent.children[viewToUnload.id]; // remove it from the parents children
if(viewToUnload.destroy){
viewToUnload.destroy(); // call destroy for the view.
}
}
});
});