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.
132 lines (120 loc) • 4.65 kB
JavaScript
define([
"dojo/_base/declare",
"dojo/_base/lang",
"dojo/Stateful",
"./_atBindingMixin"
], function(declare, lang, Stateful, _atBindingMixin){
return declare("dojox.mvc._Controller", [Stateful, _atBindingMixin], {
postscript: function(/*Object?*/ params, /*DomNode|String?*/ srcNodeRef){
// summary:
// If this object is not called from Dojo parser, starts this up right away.
// Also, if widget registry is available, register this object.
// If there is dijit/_WidgetBase in upper class hierarchy (happens when this descendant is mixed into a widget), let _WidgetBase do all work
if(this._applyAttributes){
return this.inherited(arguments);
}
// Look for dojox/mvc/at handles in the parameters
this._dbpostscript(params, srcNodeRef);
// Merge the parameters to this
if(params){
this.params = params;
for(var s in params){
this.set(s, params[s]);
}
}
// Add this instance to dijit/registry, if it's available
var registry;
try{
// Usage of dijit/registry module is optional. Do not use it if it's not already loaded.
registry = require("dijit/registry");
this.id = this.id || (srcNodeRef || {}).id || registry.getUniqueId(this.declaredClass.replace(/\./g, "_"));
registry.add(this);
}catch(e){}
if(!srcNodeRef){
// If this instance is not created via Dojo parser, start this up right away
this.startup();
}else{
// If this is created via Dojo parser, set widgetId attribute so that destroyDescendants() of parent widget works
srcNodeRef.setAttribute("widgetId", this.id);
}
},
startup: function(){
// summary:
// Starts up data binding as this object starts up.
if(!this._applyAttributes){
this._startAtWatchHandles();
}
// If there is dijit/_WidgetBase in upper class hierarchy (happens when this descendant is mixed into a widget), let _WidgetBase do all work
this.inherited(arguments);
},
destroy: function(){
// summary:
// Stops data binding as this object is destroyed.
this._beingDestroyed = true;
if(!this._applyAttributes){
this._stopAtWatchHandles();
}
// If there is dijit/_WidgetBase in upper class hierarchy (happens when this descendant is mixed into a widget), let _WidgetBase do all work
this.inherited(arguments);
if(!this._applyAttributes){
try{
// Remove this instance from dijit/registry
// Usage of dijit/registry module is optional. Do not use it if it's not already loaded.
require("dijit/registry").remove(this.id);
}catch(e){}
}
this._destroyed = true;
},
set: function(/*String*/ name, /*Anything*/ value){
// summary:
// If the value given is dojox/mvc/at handle, use it for data binding.
// Otherwise, if setter function is there, use it.
// Otherwise, set the value to the data model or to this object.
// name: String
// The property name.
// value: Anything
// The property value.
// If an object is used, iterate through object
if(typeof name === "object"){
for(var x in name){
if(name.hasOwnProperty(x)){
this.set(x, name[x]);
}
}
return this;
}
if(!this._applyAttributes){
if((value || {}).atsignature == "dojox.mvc.at"){
// If dojox/mvc/at handle is given, use it for data binding
return this._setAtWatchHandle(name, value);
}else{
// Otherwise align the setter interface to _WidgetBase
var setterName = "_set" + name.replace(/^[a-z]/, function(c){ return c.toUpperCase(); }) + "Attr";
if(this[setterName]){
this[setterName](value);
}else{
this._set(name, value);
}
return this;
}
}
// If there is dijit/_WidgetBase in upper class hierarchy (happens when this descendant is mixed into a widget), let _WidgetBase do all work
return this.inherited(arguments);
},
_set: function(/*String*/ name, /*Anything*/ value){
// summary:
// Implement _set() interface so that _set() behavior is consistent whether the instance inherits _WidgetBase or not.
// If the instance does not inherit _WidgetBase, use dojo/Stateful/_changeAttrValue() that's equivalent to dijit/_WidgetBase._set().
// name: String
// The property name.
// value: Anything
// The property value.
if(!this._applyAttributes){
// Call dojo/Stateful/_changeAttrValue() that's equivalent to dijit/_WidgetBase/_set()
return this._changeAttrValue(name, value);
}
// If there is dijit/_WidgetBase in upper class hierarchy (happens when this descendant is mixed into a widget), let _WidgetBase do all work
return this.inherited(arguments);
}
});
});