New file |
0,0 → 1,76 |
if(!dojo._hasResource["dijit.Declaration"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. |
dojo._hasResource["dijit.Declaration"] = true; |
dojo.provide("dijit.Declaration"); |
dojo.require("dijit._Widget"); |
dojo.require("dijit._Templated"); |
|
dojo.declare( |
"dijit.Declaration", |
dijit._Widget, |
{ |
// summary: |
// The Declaration widget allows a user to declare new widget |
// classes directly from a snippet of markup. |
|
_noScript: true, |
widgetClass: "", |
replaceVars: true, |
defaults: null, |
mixins: [], |
buildRendering: function(){ |
var src = this.srcNodeRef.parentNode.removeChild(this.srcNodeRef); |
var preambles = dojo.query("> script[type='dojo/method'][event='preamble']", src).orphan(); |
var scripts = dojo.query("> script[type^='dojo/']", src).orphan(); |
var srcType = src.nodeName; |
|
var propList = this.defaults||{}; |
|
// map array of strings like [ "dijit.form.Button" ] to array of mixin objects |
// (note that dojo.map(this.mixins, dojo.getObject) doesn't work because it passes |
// a bogus third argument to getObject(), confusing it) |
this.mixins = this.mixins.length ? |
dojo.map(this.mixins, function(name){ return dojo.getObject(name); } ) : |
[ dijit._Widget, dijit._Templated ]; |
|
if(preambles.length){ |
// we only support one preamble. So be it. |
propList.preamble = dojo.parser._functionFromScript(preambles[0]); |
} |
|
var parsedScripts = dojo.map(scripts, function(s){ |
var evt = s.getAttribute("event")||"postscript"; |
return { |
event: evt, |
func: dojo.parser._functionFromScript(s) |
}; |
}); |
|
// do the connects for each <script type="dojo/connect" event="foo"> block and make |
// all <script type="dojo/method"> tags execute right after construction |
this.mixins.push(function(){ |
dojo.forEach(parsedScripts, function(s){ |
dojo.connect(this, s.event, this, s.func); |
}, this); |
}); |
|
propList.widgetsInTemplate = true; |
propList._skipNodeCache = true; |
propList.templateString = "<"+srcType+" class='"+src.className+"' dojoAttachPoint='"+(src.getAttribute("dojoAttachPoint")||'')+"' dojoAttachEvent='"+(src.getAttribute("dojoAttachEvent")||'')+"' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+srcType+">"; |
// console.debug(propList.templateString); |
|
// strip things so we don't create stuff under us in the initial setup phase |
dojo.query("[dojoType]", src).forEach(function(node){ |
node.removeAttribute("dojoType"); |
}); |
|
// create the new widget class |
dojo.declare( |
this.widgetClass, |
this.mixins, |
propList |
); |
} |
} |
); |
|
} |