77 lines
2.6 KiB
JavaScript
77 lines
2.6 KiB
JavaScript
|
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
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
);
|
||
|
|
||
|
}
|