123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- define("dojox/dtl/contrib/dom", [
- "dojo/_base/kernel",
- "dojo/_base/lang",
- "dojo/_base/connect",
- "dojo/dom-style",
- "dojo/dom-construct",
- "../_base",
- "../dom"
- ], function(kernel,lang,connect,domStyle,domConstruct,dd,dddom){
- /*=====
- dd = dojox.dtl;
- =====*/
- var ddch = lang.getObject("dojox.dtl.contrib.dom", true);
- var simple = {render: function(){ return this.contents; }};
- ddch.StyleNode = lang.extend(function(styles){
- this.contents = {};
- this._current = {};
- this._styles = styles;
- for(var key in styles){
- if(styles[key].indexOf("{{") != -1){
- var node = new dd.Template(styles[key]);
- }else{
- var node = lang.delegate(simple);
- node.contents = styles[key];
- }
- this.contents[key] = node;
- }
- },
- {
- render: function(context, buffer){
- for(var key in this.contents){
- var value = this.contents[key].render(context);
- if(this._current[key] != value){
- domStyle.set(buffer.getParent(), key, this._current[key] = value);
- }
- }
- return buffer;
- },
- unrender: function(context, buffer){
- this._current = {};
- return buffer;
- },
- clone: function(buffer){
- return new this.constructor(this._styles);
- }
- });
- ddch.BufferNode = lang.extend(function(nodelist, options){
- this.nodelist = nodelist;
- this.options = options;
- },
- {
- _swap: function(type, node){
- if(!this.swapped && this.parent.parentNode){
- if(type == "node"){
- if((node.nodeType == 3 && !this.options.text) || (node.nodeType == 1 && !this.options.node)){
- return;
- }
- }else if(type == "class"){
- if(type != "class"){
- return;
- }
- }
- this.onAddNode && connect.disconnect(this.onAddNode);
- this.onRemoveNode && connect.disconnect(this.onRemoveNode);
- this.onChangeAttribute && connect.disconnect(this.onChangeAttribute);
- this.onChangeData && connect.disconnect(this.onChangeData);
- this.swapped = this.parent.cloneNode(true);
- this.parent.parentNode.replaceChild(this.swapped, this.parent);
- }
- },
- render: function(context, buffer){
- this.parent = buffer.getParent();
- if(this.options.node){
- this.onAddNode = connect.connect(buffer, "onAddNode", lang.hitch(this, "_swap", "node"));
- this.onRemoveNode = connect.connect(buffer, "onRemoveNode", lang.hitch(this, "_swap", "node"));
- }
- if(this.options.text){
- this.onChangeData = connect.connect(buffer, "onChangeData", lang.hitch(this, "_swap", "node"));
- }
- if(this.options["class"]){
- this.onChangeAttribute = connect.connect(buffer, "onChangeAttribute", lang.hitch(this, "_swap", "class"));
- }
- buffer = this.nodelist.render(context, buffer);
- if(this.swapped){
- this.swapped.parentNode.replaceChild(this.parent, this.swapped);
- domConstruct.destroy(this.swapped);
- }else{
- this.onAddNode && connect.disconnect(this.onAddNode);
- this.onRemoveNode && connect.disconnect(this.onRemoveNode);
- this.onChangeAttribute && connect.disconnect(this.onChangeAttribute);
- this.onChangeData && connect.disconnect(this.onChangeData);
- }
- delete this.parent;
- delete this.swapped;
- return buffer;
- },
- unrender: function(context, buffer){
- return this.nodelist.unrender(context, buffer);
- },
- clone: function(buffer){
- return new this.constructor(this.nodelist.clone(buffer), this.options);
- }
- });
- lang.mixin(ddch, {
- buffer: function(parser, token){
- // summary:
- // Buffer large DOM manipulations during re-render.
- // description:
- // When using DomTemplate, wrap any content
- // that you expect to change often during
- // re-rendering. It will then remove its parent
- // from the main document while it re-renders that
- // section of code. It will only remove it from
- // the main document if a mainpulation of somes sort
- // happens. ie It won't swap out if it diesn't have to.
- // example:
- // By default, it considers only node addition/removal
- // to be "changing"
- //
- // | {% buffer %}{% for item in items %}<li>{{ item }}</li>{% endfor %}{% endbuffer %}
- // example:
- // You can explicitly declare options:
- //
- // * node: Watch node removal/addition
- // * class: Watch for a classname to be changed
- // * text: Watch for any text to be changed
- //
- // | {% buffer node class %}{% for item in items %}<li>{{ item }}</li>{% endfor %}{% endbuffer %}
- var parts = token.contents.split().slice(1);
- var options = {};
- var found = false;
- for(var i = parts.length; i--;){
- found = true;
- options[parts[i]] = true;
- }
- if(!found){
- options.node = true;
- }
- var nodelist = parser.parse(["endbuffer"]);
- parser.next_token();
- return new ddch.BufferNode(nodelist, options);
- },
- html: function(parser, token){
- kernel.deprecated("{% html someVariable %}", "Use {{ someVariable|safe }} instead");
- return parser.create_variable_node(token.contents.slice(5) + "|safe");
- },
- style_: function(parser, token){
- var styles = {};
- token = token.contents.replace(/^style\s+/, "");
- var rules = token.split(/\s*;\s*/g);
- for(var i = 0, rule; rule = rules[i]; i++){
- var parts = rule.split(/\s*:\s*/g);
- var key = parts[0];
- var value = lang.trim(parts[1]);
- if(value){
- styles[key] = value;
- }
- }
- return new ddch.StyleNode(styles);
- }
- });
- dd.register.tags("dojox.dtl.contrib", {
- "dom": ["html", "attr:style", "buffer"]
- });
- return dojox.dtl.contrib.dom;
- });
|