source: Dev/trunk/src/client/dojox/dtl/_Templated.js @ 532

Last change on this file since 532 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 4.4 KB
Line 
1define([
2        "dojo/aspect",
3        "dojo/_base/declare",
4        "./_base",
5        "dijit/_TemplatedMixin",
6        "dojo/dom-construct",
7        "dojo/cache",
8        "dojo/_base/array",
9        "dojo/string",
10        "dojo/parser"
11], function(aspect,declare,dd,TemplatedMixin, domConstruct,Cache,Array,dString,Parser){
12
13        return declare("dojox.dtl._Templated", TemplatedMixin, {
14                // summary:
15                //              The base-class for DTL-templated widgets.
16
17                _dijitTemplateCompat: false,
18               
19                buildRendering: function(){
20                        var node;
21
22                        if(this.domNode && !this._template){
23                                return;
24                        }
25
26                        if(!this._template){
27                                var t = this.getCachedTemplate(
28                                        this.templatePath,
29                                        this.templateString,
30                                        this._skipNodeCache
31                                );
32                                if(t instanceof dd.Template) {
33                                        this._template = t;
34                                }else{
35                                        node = t.cloneNode(true);
36                                }
37                        }
38                        if(!node){
39                                var context = new dd._Context(this);
40                                if(!this._created){
41                                        delete context._getter;
42                                }
43                                var nodes = domConstruct.toDom(
44                                        this._template.render(context)
45                                );
46                                // TODO: is it really necessary to look for the first node?
47                                if(nodes.nodeType !== 1 && nodes.nodeType !== 3){
48                                        // nodes.nodeType === 11
49                                        // the node is a document fragment
50                                        for(var i = 0, l = nodes.childNodes.length; i < l; ++i){
51                                                node = nodes.childNodes[i];
52                                                if(node.nodeType == 1){
53                                                        break;
54                                                }
55                                        }
56                                }else{
57                                        // the node is an element or a text
58                                        node = nodes;
59                                }
60                        }
61                        this._attachTemplateNodes(node);
62                        if(this.widgetsInTemplate){
63                                //Make sure dojoType is used for parsing widgets in template.
64                                //The Parser.query could be changed from multiversion support.
65                                var parser = Parser, qry, attr;
66                                if(parser._query != "[dojoType]"){
67                                        qry = parser._query;
68                                        attr = parser._attrName;
69                                        parser._query = "[dojoType]";
70                                        parser._attrName = "dojoType";
71                                }
72
73                                //Store widgets that we need to start at a later point in time
74                                var cw = (this._startupWidgets = Parser.parse(node, {
75                                        noStart: !this._earlyTemplatedStartup,
76                                        inherited: {dir: this.dir, lang: this.lang}
77                                }));
78
79                                //Restore the query.
80                                if(qry){
81                                        parser._query = qry;
82                                        parser._attrName = attr;
83                                }
84
85                                // Hook up attach points and events for nodes that were converted to widgets
86                                for(var i = 0; i < cw.length; i++){
87                                        this._processTemplateNode(cw[i], function(n,p){
88                                                return n[p];
89                                        }, function(widget, type, callback){
90                                                // function to do data-dojo-attach-event to a widget
91                                                if(type in widget){
92                                                        // back-compat, remove for 2.0
93                                                        return aspect.after(widget, type, callback, true);
94                                                }else{
95                                                        // 1.x may never hit this branch, but it's the default for 2.0
96                                                        return widget.on(type, callback, true);
97                                                }
98                                        });
99                                }
100                        }
101
102                        if(this.domNode){
103                                domConstruct.place(node, this.domNode, "before");
104                                this.destroyDescendants();
105                                domConstruct.destroy(this.domNode);
106                        }
107                        this.domNode = node;
108
109                        this._fillContent(this.srcNodeRef);
110                },
111
112                _processTemplateNode: function(/*DOMNode|Widget*/ baseNode, getAttrFunc, attachFunc){
113                        // Override _AttachMixin._processNode to skip nodes with data-dojo-type set.   They are handled separately
114                        // in the buildRendering() code above.
115
116                        if(this.widgetsInTemplate && (getAttrFunc(baseNode, "dojoType") || getAttrFunc(baseNode, "data-dojo-type"))){
117                                return true;
118                        }
119
120                        this.inherited(arguments);
121                },
122
123                _templateCache: {},
124                getCachedTemplate: function(templatePath, templateString, alwaysUseString){
125                        // summary:
126                        //              Layer for dijit._Templated.getCachedTemplate
127                        var tmplts = this._templateCache;
128                        var key = templateString || templatePath;
129                        if(tmplts[key]){
130                                return tmplts[key];
131                        }
132
133                        templateString = dString.trim(templateString || Cache(templatePath, {sanitize: true}));
134
135                        if(     this._dijitTemplateCompat &&
136                                (alwaysUseString || templateString.match(/\$\{([^\}]+)\}/g))
137                        ){
138                                templateString = this._stringRepl(templateString);
139                        }
140
141                        // If we always use a string, or find no variables, just store it as a node
142                        if(alwaysUseString || !templateString.match(/\{[{%]([^\}]+)[%}]\}/g)){
143                                return tmplts[key] = domConstruct.toDom(templateString);
144                        }else{
145                                return tmplts[key] = new dd.Template(templateString);
146                        }
147                },
148                render: function(){
149                        // summary:
150                        //              Renders the widget.
151                        this.buildRendering();
152                },
153                startup: function(){
154                        Array.forEach(this._startupWidgets, function(w){
155                                if(w && !w._started && w.startup){
156                                        w.startup();
157                                }
158                        });
159                        this.inherited(arguments);
160                }
161        });
162});
Note: See TracBrowser for help on using the repository browser.