123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- define("dijit/Declaration", [
- "dojo/_base/array", // array.forEach array.map
- "dojo/_base/connect", // connect.connect
- "dojo/_base/declare", // declare
- "dojo/_base/lang", // lang.getObject
- "dojo/parser", // parser._functionFromScript
- "dojo/query", // query
- "./_Widget",
- "./_TemplatedMixin",
- "./_WidgetsInTemplateMixin",
- "dojo/NodeList-dom"
- ], function(array, connect, declare, lang, parser, query, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin){
- /*=====
- var _Widget = dijit._Widget;
- var _TemplatedMixin = dijit._TemplatedMixin;
- var _WidgetsInTemplateMixin = dijit._WidgetsInTemplateMixin;
- =====*/
- // module:
- // dijit/Declaration
- // summary:
- // The Declaration widget allows a developer to declare new widget
- // classes directly from a snippet of markup.
- return declare("dijit.Declaration", _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 = query("> script[type^='dojo/method']", src).orphan(),
- connects = 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).
- array.forEach(methods, function(s){
- var evt = s.getAttribute("event") || s.getAttribute("data-dojo-event"),
- func = 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 array.map(this.mixins, lang.getObject) doesn't work because it passes
- // a bogus third argument to getObject(), confusing it)
- this.mixins = this.mixins.length ?
- array.map(this.mixins, function(name){ return lang.getObject(name); } ) :
- [ _Widget, _TemplatedMixin, _WidgetsInTemplateMixin ];
- propList._skipNodeCache = true;
- propList.templateString =
- "<"+srcType+" class='"+src.className+"'" +
- " data-dojo-attach-point='"+
- (src.getAttribute("data-dojo-attach-point") || src.getAttribute("dojoAttachPoint") || '')+
- "' data-dojo-attach-event='"+
- (src.getAttribute("data-dojo-attach-event") || src.getAttribute("dojoAttachEvent") || '')+
- "' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+srcType+">";
- // create the new widget class
- var wc = 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_.
- array.forEach(connects, function(s){
- var evt = s.getAttribute("event") || s.getAttribute("data-dojo-event") || "postscript",
- func = parser._functionFromScript(s);
- connect.connect(wc.prototype, evt, func);
- });
- }
- });
- });
|