Template-more.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:5k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /**
  2.  * @class Ext.Template
  3.  */
  4. Ext.apply(Ext.Template.prototype, {
  5.     /**
  6.      * @cfg {Boolean} disableFormats Specify <tt>true</tt> to disable format
  7.      * functions in the template. If the template does not contain
  8.      * {@link Ext.util.Format format functions}, setting <code>disableFormats</code>
  9.      * to true will reduce <code>{@link #apply}</code> time. Defaults to <tt>false</tt>.
  10.      * <pre><code>
  11. var t = new Ext.Template(
  12.     '&lt;div name="{id}"&gt;',
  13.         '&lt;span class="{cls}"&gt;{name} {value}&lt;/span&gt;',
  14.     '&lt;/div&gt;',
  15.     {
  16.         compiled: true,      // {@link #compile} immediately
  17.         disableFormats: true // reduce <code>{@link #apply}</code> time since no formatting
  18.     }    
  19. );
  20.      * </code></pre>
  21.      * For a list of available format functions, see {@link Ext.util.Format}.
  22.      */
  23.     disableFormats : false,
  24.     /**
  25.      * See <code>{@link #disableFormats}</code>.
  26.      * @type Boolean
  27.      * @property disableFormats
  28.      */
  29.     /**
  30.      * The regular expression used to match template variables
  31.      * @type RegExp
  32.      * @property
  33.      * @hide repeat doc
  34.      */
  35.     re : /{([w-]+)(?::([w.]*)(?:((.*?)?))?)?}/g,
  36.     /**
  37.      * Returns an HTML fragment of this template with the specified values applied.
  38.      * @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'})
  39.      * @return {String} The HTML fragment
  40.      * @hide repeat doc
  41.      */
  42.     applyTemplate : function(values){
  43. var me = this,
  44. useF = me.disableFormats !== true,
  45.          fm = Ext.util.Format, 
  46.          tpl = me;     
  47.     
  48.         if(me.compiled){
  49.             return me.compiled(values);
  50.         }
  51.         function fn(m, name, format, args){
  52.             if (format && useF) {
  53.                 if (format.substr(0, 5) == "this.") {
  54.                     return tpl.call(format.substr(5), values[name], values);
  55.                 } else {
  56.                     if (args) {
  57.                         // quoted values are required for strings in compiled templates,
  58.                         // but for non compiled we need to strip them
  59.                         // quoted reversed for jsmin
  60.                         var re = /^s*['"](.*)["']s*$/;
  61.                         args = args.split(',');
  62.                         for(var i = 0, len = args.length; i < len; i++){
  63.                             args[i] = args[i].replace(re, "$1");
  64.                         }
  65.                         args = [values[name]].concat(args);
  66.                     } else {
  67.                         args = [values[name]];
  68.                     }
  69.                     return fm[format].apply(fm, args);
  70.                 }
  71.             } else {
  72.                 return values[name] !== undefined ? values[name] : "";
  73.             }
  74.         }
  75.         return me.html.replace(me.re, fn);
  76.     },
  77.     /**
  78.      * Compiles the template into an internal function, eliminating the RegEx overhead.
  79.      * @return {Ext.Template} this
  80.      * @hide repeat doc
  81.      */
  82.     compile : function(){
  83.         var me = this,
  84.          fm = Ext.util.Format,
  85.          useF = me.disableFormats !== true,
  86.          sep = Ext.isGecko ? "+" : ",",
  87.          body;
  88.         
  89.         function fn(m, name, format, args){
  90.             if(format && useF){
  91.                 args = args ? ',' + args : "";
  92.                 if(format.substr(0, 5) != "this."){
  93.                     format = "fm." + format + '(';
  94.                 }else{
  95.                     format = 'this.call("'+ format.substr(5) + '", ';
  96.                     args = ", values";
  97.                 }
  98.             }else{
  99.                 args= ''; format = "(values['" + name + "'] == undefined ? '' : ";
  100.             }
  101.             return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'";
  102.         }
  103.         
  104.         // branched to use + in gecko and [].join() in others
  105.         if(Ext.isGecko){
  106.             body = "this.compiled = function(values){ return '" +
  107.                    me.html.replace(/\/g, '\\').replace(/(rn|n)/g, '\n').replace(/'/g, "\'").replace(this.re, fn) +
  108.                     "';};";
  109.         }else{
  110.             body = ["this.compiled = function(values){ return ['"];
  111.             body.push(me.html.replace(/\/g, '\\').replace(/(rn|n)/g, '\n').replace(/'/g, "\'").replace(this.re, fn));
  112.             body.push("'].join('');};");
  113.             body = body.join('');
  114.         }
  115.         eval(body);
  116.         return me;
  117.     },
  118.     
  119.     // private function used to call members
  120.     call : function(fnName, value, allValues){
  121.         return this[fnName](value, allValues);
  122.     }
  123. });
  124. Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;