Template.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:7k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.0.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.Template
  9.  * Represents an HTML fragment template. Templates can be precompiled for greater performance.
  10.  * For a list of available format functions, see {@link Ext.util.Format}.<br />
  11.  * Usage:
  12. <pre><code>
  13. var t = new Ext.Template(
  14.     '&lt;div name="{id}"&gt;',
  15.         '&lt;span class="{cls}"&gt;{name:trim} {value:ellipsis(10)}&lt;/span&gt;',
  16.     '&lt;/div&gt;'
  17. );
  18. t.append('some-element', {id: 'myid', cls: 'myclass', name: 'foo', value: 'bar'});
  19. </code></pre>
  20.  * @constructor
  21.  * @param {String/Array} html The HTML fragment or an array of fragments to join("") or multiple arguments to join("")
  22.  */
  23. Ext.Template = function(html){
  24.     var me = this,
  25.      a = arguments,
  26.      buf = [];
  27.     if (Ext.isArray(html)) {
  28.         html = html.join("");
  29.     } else if (a.length > 1) {
  30.     Ext.each(a, function(v) {
  31.             if (Ext.isObject(v)) {
  32.                 Ext.apply(me, v);
  33.             } else {
  34.                 buf.push(v);
  35.             }
  36.         });
  37.         html = buf.join('');
  38.     }
  39.     /**@private*/
  40.     me.html = html;
  41.     if (me.compiled) {
  42.         me.compile();
  43.     }
  44. };
  45. Ext.Template.prototype = {
  46.     /**
  47.      * Returns an HTML fragment of this template with the specified values applied.
  48.      * @param {Object/Array} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  49.      * @return {String} The HTML fragment
  50.      */
  51.     applyTemplate : function(values){
  52. var me = this;
  53.         return me.compiled ?
  54.          me.compiled(values) :
  55. me.html.replace(me.re, function(m, name){
  56.          return values[name] !== undefined ? values[name] : "";
  57.         });
  58. },
  59.     /**
  60.      * Sets the HTML used as the template and optionally compiles it.
  61.      * @param {String} html
  62.      * @param {Boolean} compile (optional) True to compile the template (defaults to undefined)
  63.      * @return {Ext.Template} this
  64.      */
  65.     set : function(html, compile){
  66.     var me = this;
  67.         me.html = html;
  68.         me.compiled = null;
  69.         return compile ? me.compile() : me;
  70.     },
  71.     /**
  72.     * The regular expression used to match template variables
  73.     * @type RegExp
  74.     * @property
  75.     */
  76.     re : /{([w-]+)}/g,
  77.     /**
  78.      * Compiles the template into an internal function, eliminating the RegEx overhead.
  79.      * @return {Ext.Template} this
  80.      */
  81.     compile : function(){
  82.         var me = this,
  83.          sep = Ext.isGecko ? "+" : ",";
  84.         function fn(m, name){                        
  85.         name = "values['" + name + "']";
  86.         return "'"+ sep + '(' + name + " == undefined ? '' : " + name + ')' + sep + "'";
  87.         }
  88.                 
  89.         eval("this.compiled = function(values){ return " + (Ext.isGecko ? "'" : "['") +
  90.              me.html.replace(/\/g, '\\').replace(/(rn|n)/g, '\n').replace(/'/g, "\'").replace(this.re, fn) +
  91.              (Ext.isGecko ?  "';};" : "'].join('');};"));
  92.         return me;
  93.     },
  94.     /**
  95.      * Applies the supplied values to the template and inserts the new node(s) as the first child of el.
  96.      * @param {Mixed} el The context element
  97.      * @param {Object/Array} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  98.      * @param {Boolean} returnElement (optional) true to return a Ext.Element (defaults to undefined)
  99.      * @return {HTMLElement/Ext.Element} The new node or Element
  100.      */
  101.     insertFirst: function(el, values, returnElement){
  102.         return this.doInsert('afterBegin', el, values, returnElement);
  103.     },
  104.     /**
  105.      * Applies the supplied values to the template and inserts the new node(s) before el.
  106.      * @param {Mixed} el The context element
  107.      * @param {Object/Array} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  108.      * @param {Boolean} returnElement (optional) true to return a Ext.Element (defaults to undefined)
  109.      * @return {HTMLElement/Ext.Element} The new node or Element
  110.      */
  111.     insertBefore: function(el, values, returnElement){
  112.         return this.doInsert('beforeBegin', el, values, returnElement);
  113.     },
  114.     /**
  115.      * Applies the supplied values to the template and inserts the new node(s) after el.
  116.      * @param {Mixed} el The context element
  117.      * @param {Object/Array} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  118.      * @param {Boolean} returnElement (optional) true to return a Ext.Element (defaults to undefined)
  119.      * @return {HTMLElement/Ext.Element} The new node or Element
  120.      */
  121.     insertAfter : function(el, values, returnElement){
  122.         return this.doInsert('afterEnd', el, values, returnElement);
  123.     },
  124.     /**
  125.      * Applies the supplied values to the template and appends the new node(s) to el.
  126.      * @param {Mixed} el The context element
  127.      * @param {Object/Array} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  128.      * @param {Boolean} returnElement (optional) true to return a Ext.Element (defaults to undefined)
  129.      * @return {HTMLElement/Ext.Element} The new node or Element
  130.      */
  131.     append : function(el, values, returnElement){
  132.         return this.doInsert('beforeEnd', el, values, returnElement);
  133.     },
  134.     doInsert : function(where, el, values, returnEl){
  135.         el = Ext.getDom(el);
  136.         var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
  137.         return returnEl ? Ext.get(newNode, true) : newNode;
  138.     },
  139.     /**
  140.      * Applies the supplied values to the template and overwrites the content of el with the new node(s).
  141.      * @param {Mixed} el The context element
  142.      * @param {Object/Array} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  143.      * @param {Boolean} returnElement (optional) true to return a Ext.Element (defaults to undefined)
  144.      * @return {HTMLElement/Ext.Element} The new node or Element
  145.      */
  146.     overwrite : function(el, values, returnElement){
  147.         el = Ext.getDom(el);
  148.         el.innerHTML = this.applyTemplate(values);
  149.         return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
  150.     }
  151. };
  152. /**
  153.  * Alias for {@link #applyTemplate}
  154.  * Returns an HTML fragment of this template with the specified values applied.
  155.  * @param {Object/Array} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  156.  * @return {String} The HTML fragment
  157.  * @member Ext.Template
  158.  * @method apply
  159.  */
  160. Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
  161. /**
  162.  * Creates a template from the passed element's value (<i>display:none</i> textarea, preferred) or innerHTML.
  163.  * @param {String/HTMLElement} el A DOM element or its id
  164.  * @param {Object} config A configuration object
  165.  * @return {Ext.Template} The created template
  166.  * @static
  167.  */
  168. Ext.Template.from = function(el, config){
  169.     el = Ext.getDom(el);
  170.     return new Ext.Template(el.value || el.innerHTML, config || '');
  171. };