diff options
author | Andrew Dolgov <[email protected]> | 2011-11-08 20:40:44 +0400 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2011-11-08 20:40:44 +0400 |
commit | 81bea17aefb26859f825b9293c7c99192874806e (patch) | |
tree | fb244408ca271affa2899adb634788802c9a89d8 /lib/dijit/Declaration.js | |
parent | 870a70e109ac9e80a88047044530de53d0404ec7 (diff) |
upgrade Dojo to 1.6.1
Diffstat (limited to 'lib/dijit/Declaration.js')
-rw-r--r-- | lib/dijit/Declaration.js | 122 |
1 files changed, 96 insertions, 26 deletions
diff --git a/lib/dijit/Declaration.js b/lib/dijit/Declaration.js index 57cbfd031..1cfa8ecad 100644 --- a/lib/dijit/Declaration.js +++ b/lib/dijit/Declaration.js @@ -1,36 +1,106 @@ /* - Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved. + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. Available via Academic Free License >= 2.1 OR the modified BSD license. see: http://dojotoolkit.org/license for details */ -if(!dojo._hasResource["dijit.Declaration"]){ -dojo._hasResource["dijit.Declaration"]=true; +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,{_noScript:true,widgetClass:"",defaults:null,mixins:[],buildRendering:function(){ -var _1=this.srcNodeRef.parentNode.removeChild(this.srcNodeRef),_2=dojo.query("> script[type^='dojo/method'][event]",_1).orphan(),_3=dojo.query("> script[type^='dojo/method']",_1).orphan(),_4=dojo.query("> script[type^='dojo/connect']",_1).orphan(),_5=_1.nodeName; -var _6=this.defaults||{}; -dojo.forEach(_2,function(s){ -var _7=s.getAttribute("event"),_8=dojo.parser._functionFromScript(s); -_6[_7]=_8; -}); -this.mixins=this.mixins.length?dojo.map(this.mixins,function(_9){ -return dojo.getObject(_9); -}):[dijit._Widget,dijit._Templated]; -_6.widgetsInTemplate=true; -_6._skipNodeCache=true; -_6.templateString="<"+_5+" class='"+_1.className+"' dojoAttachPoint='"+(_1.getAttribute("dojoAttachPoint")||"")+"' dojoAttachEvent='"+(_1.getAttribute("dojoAttachEvent")||"")+"' >"+_1.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+_5+">"; -dojo.query("[dojoType]",_1).forEach(function(_a){ -_a.removeAttribute("dojoType"); -}); -var wc=dojo.declare(this.widgetClass,this.mixins,_6); -var _b=_4.concat(_3); -dojo.forEach(_b,function(s){ -var _c=s.getAttribute("event")||"postscript",_d=dojo.parser._functionFromScript(s); -dojo.connect(wc.prototype,_c,_d); -}); -}}); + + +dojo.declare( + "dijit.Declaration", + dijit._Widget, + { + // summary: + // The Declaration widget allows a developer to declare new widget + // classes directly from a snippet of markup. + + // _noScript: [private] Boolean + // Flag to parser to leave alone the script tags contained inside of me + _noScript: true, + + // stopParser: [private] Boolean + // Flag to parser to not try and parse widgets declared inside of me + stopParser: true, + + // widgetClass: [const] String + // Name of class being declared, ex: "acme.myWidget" + widgetClass: "", + + // propList: [const] Object + // Set of attributes for this widget along with default values, ex: + // {delay: 100, title: "hello world"} + defaults: null, + + // mixins: [const] String[] + // List containing the prototype for this widget, and also any mixins, + // ex: ["dijit._Widget", "dijit._Container"] + mixins: [], + + buildRendering: function(){ + var src = this.srcNodeRef.parentNode.removeChild(this.srcNodeRef), + methods = dojo.query("> script[type^='dojo/method']", src).orphan(), + connects = dojo.query("> script[type^='dojo/connect']", src).orphan(), + srcType = src.nodeName; + + var propList = this.defaults || {}; + + // For all methods defined like <script type="dojo/method" data-dojo-event="foo">, + // add that method to prototype. + // If there's no "event" specified then it's code to run on instantiation, + // so it becomes a connection to "postscript" (handled below). + dojo.forEach(methods, function(s){ + var evt = s.getAttribute("event") || s.getAttribute("data-dojo-event"), + func = dojo.parser._functionFromScript(s); + if(evt){ + propList[evt] = func; + }else{ + connects.push(s); + } + }); + + // 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 ]; + + 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+">"; + + // 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 + var wc = dojo.declare( + this.widgetClass, + this.mixins, + propList + ); + + // Handle <script> blocks of form: + // <script type="dojo/connect" data-dojo-event="foo"> + // and + // <script type="dojo/method"> + // (Note that the second one is just shorthand for a dojo/connect to postscript) + // Since this is a connect in the declaration, we are actually connection to the method + // in the _prototype_. + dojo.forEach(connects, function(s){ + var evt = s.getAttribute("event") || s.getAttribute("data-dojo-event") || "postscript", + func = dojo.parser._functionFromScript(s); + dojo.connect(wc.prototype, evt, func); + }); + } + } +); + } |