X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/6746dc89c47ed01b165cc1152533605f97eb8e8d..refs/heads/master:/docs/source/XTemplate.html diff --git a/docs/source/XTemplate.html b/docs/source/XTemplate.html index e080f40c..b0547026 100644 --- a/docs/source/XTemplate.html +++ b/docs/source/XTemplate.html @@ -3,8 +3,8 @@
/** - * @class Ext.XTemplate - * @extends Ext.Template - * <p>A template class that supports advanced functionality like:<div class="mdetail-params"><ul> - * <li>Autofilling arrays using templates and sub-templates</li> - * <li>Conditional processing with basic comparison operators</li> - * <li>Basic math function support</li> - * <li>Execute arbitrary inline code with special built-in template variables</li> - * <li>Custom member functions</li> - * <li>Many special tags and built-in operators that aren't defined as part of - * the API, but are supported in the templates that can be created</li> - * </ul></div></p> - * <p>XTemplate provides the templating mechanism built into:<div class="mdetail-params"><ul> - * <li>{@link Ext.view.View}</li> - * </ul></div></p> - * - * The {@link Ext.Template} describes - * the acceptable parameters to pass to the constructor. The following - * examples demonstrate all of the supported features.</p> - * - * <div class="mdetail-params"><ul> - * - * <li><b><u>Sample Data</u></b> - * <div class="sub-desc"> - * <p>This is the data object used for reference in each code example:</p> - * <pre><code> -var data = { -name: 'Tommy Maintz', -title: 'Lead Developer', -company: 'Sencha Inc.', -email: 'tommy@sencha.com', -address: '5 Cups Drive', -city: 'Palo Alto', -state: 'CA', -zip: '44102', -drinks: ['Coffee', 'Soda', 'Water'], -kids: [{ - name: 'Joshua', - age:3 - },{ - name: 'Matthew', - age:2 - },{ - name: 'Solomon', - age:0 -}] -}; - </code></pre> - * </div> - * </li> - * - * - * <li><b><u>Auto filling of arrays</u></b> - * <div class="sub-desc"> - * <p>The <b><tt>tpl</tt></b> tag and the <b><tt>for</tt></b> operator are used - * to process the provided data object: - * <ul> - * <li>If the value specified in <tt>for</tt> is an array, it will auto-fill, - * repeating the template block inside the <tt>tpl</tt> tag for each item in the - * array.</li> - * <li>If <tt>for="."</tt> is specified, the data object provided is examined.</li> - * <li>While processing an array, the special variable <tt>{#}</tt> - * will provide the current array index + 1 (starts at 1, not 0).</li> - * </ul> - * </p> - * <pre><code> -<tpl <b>for</b>=".">...</tpl> // loop through array at root node -<tpl <b>for</b>="foo">...</tpl> // loop through array at foo node -<tpl <b>for</b>="foo.bar">...</tpl> // loop through array at foo.bar node - </code></pre> + * A template class that supports advanced functionality like: + * + * - Autofilling arrays using templates and sub-templates + * - Conditional processing with basic comparison operators + * - Basic math function support + * - Execute arbitrary inline code with special built-in template variables + * - Custom member functions + * - Many special tags and built-in operators that aren't defined as part of the API, but are supported in the templates that can be created + * + * XTemplate provides the templating mechanism built into: + * + * - {@link Ext.view.View} + * + * The {@link Ext.Template} describes the acceptable parameters to pass to the constructor. The following examples + * demonstrate all of the supported features. + * + * # Sample Data + * + * This is the data object used for reference in each code example: + * + * var data = { + * name: 'Tommy Maintz', + * title: 'Lead Developer', + * company: 'Sencha Inc.', + * email: 'tommy@sencha.com', + * address: '5 Cups Drive', + * city: 'Palo Alto', + * state: 'CA', + * zip: '44102', + * drinks: ['Coffee', 'Soda', 'Water'], + * kids: [ + * { + * name: 'Joshua', + * age:3 + * }, + * { + * name: 'Matthew', + * age:2 + * }, + * { + * name: 'Solomon', + * age:0 + * } + * ] + * }; + * + * # Auto filling of arrays + * + * The **tpl** tag and the **for** operator are used to process the provided data object: + * + * - If the value specified in for is an array, it will auto-fill, repeating the template block inside the tpl + * tag for each item in the array. + * - If for="." is specified, the data object provided is examined. + * - While processing an array, the special variable {#} will provide the current array index + 1 (starts at 1, not 0). + * + * Examples: + * + * <tpl for=".">...</tpl> // loop through array at root node + * <tpl for="foo">...</tpl> // loop through array at foo node + * <tpl for="foo.bar">...</tpl> // loop through array at foo.bar node + * * Using the sample data above: - * <pre><code> -var tpl = new Ext.XTemplate( - '<p>Kids: ', - '<tpl <b>for</b>=".">', // process the data.kids node - '<p>{#}. {name}</p>', // use current array index to autonumber - '</tpl></p>' -); -tpl.overwrite(panel.body, data.kids); // pass the kids property of the data object - </code></pre> - * <p>An example illustrating how the <b><tt>for</tt></b> property can be leveraged - * to access specified members of the provided data object to populate the template:</p> - * <pre><code> -var tpl = new Ext.XTemplate( - '<p>Name: {name}</p>', - '<p>Title: {title}</p>', - '<p>Company: {company}</p>', - '<p>Kids: ', - '<tpl <b>for="kids"</b>>', // interrogate the kids property within the data - '<p>{name}</p>', - '</tpl></p>' -); -tpl.overwrite(panel.body, data); // pass the root node of the data object - </code></pre> - * <p>Flat arrays that contain values (and not objects) can be auto-rendered - * using the special <b><tt>{.}</tt></b> variable inside a loop. This variable - * will represent the value of the array at the current index:</p> - * <pre><code> -var tpl = new Ext.XTemplate( - '<p>{name}\'s favorite beverages:</p>', - '<tpl for="drinks">', - '<div> - {.}</div>', - '</tpl>' -); -tpl.overwrite(panel.body, data); - </code></pre> - * <p>When processing a sub-template, for example while looping through a child array, - * you can access the parent object's members via the <b><tt>parent</tt></b> object:</p> - * <pre><code> -var tpl = new Ext.XTemplate( - '<p>Name: {name}</p>', - '<p>Kids: ', - '<tpl for="kids">', - '<tpl if="age &gt; 1">', - '<p>{name}</p>', - '<p>Dad: {<b>parent</b>.name}</p>', - '</tpl>', - '</tpl></p>' -); -tpl.overwrite(panel.body, data); - </code></pre> - * </div> - * </li> - * - * - * <li><b><u>Conditional processing with basic comparison operators</u></b> - * <div class="sub-desc"> - * <p>The <b><tt>tpl</tt></b> tag and the <b><tt>if</tt></b> operator are used - * to provide conditional checks for deciding whether or not to render specific - * parts of the template. Notes:<div class="sub-desc"><ul> - * <li>Double quotes must be encoded if used within the conditional</li> - * <li>There is no <tt>else</tt> operator — if needed, two opposite - * <tt>if</tt> statements should be used.</li> - * </ul></div> - * <pre><code> -<tpl if="age > 1 && age < 10">Child</tpl> -<tpl if="age >= 10 && age < 18">Teenager</tpl> -<tpl <b>if</b>="this.isGirl(name)">...</tpl> -<tpl <b>if</b>="id==\'download\'">...</tpl> -<tpl <b>if</b>="needsIcon"><img src="{icon}" class="{iconCls}"/></tpl> -// no good: -<tpl if="name == "Tommy"">Hello</tpl> -// encode " if it is part of the condition, e.g. -<tpl if="name == &quot;Tommy&quot;">Hello</tpl> - * </code></pre> + * + * var tpl = new Ext.XTemplate( + * '<p>Kids: ', + * '<tpl for=".">', // process the data.kids node + * '<p>{#}. {name}</p>', // use current array index to autonumber + * '</tpl></p>' + * ); + * tpl.overwrite(panel.body, data.kids); // pass the kids property of the data object + * + * An example illustrating how the **for** property can be leveraged to access specified members of the provided data + * object to populate the template: + * + * var tpl = new Ext.XTemplate( + * '<p>Name: {name}</p>', + * '<p>Title: {title}</p>', + * '<p>Company: {company}</p>', + * '<p>Kids: ', + * '<tpl for="kids">', // interrogate the kids property within the data + * '<p>{name}</p>', + * '</tpl></p>' + * ); + * tpl.overwrite(panel.body, data); // pass the root node of the data object + * + * Flat arrays that contain values (and not objects) can be auto-rendered using the special **`{.}`** variable inside a + * loop. This variable will represent the value of the array at the current index: + * + * var tpl = new Ext.XTemplate( + * '<p>{name}\'s favorite beverages:</p>', + * '<tpl for="drinks">', + * '<div> - {.}</div>', + * '</tpl>' + * ); + * tpl.overwrite(panel.body, data); + * + * When processing a sub-template, for example while looping through a child array, you can access the parent object's + * members via the **parent** object: + * + * var tpl = new Ext.XTemplate( + * '<p>Name: {name}</p>', + * '<p>Kids: ', + * '<tpl for="kids">', + * '<tpl if="age > 1">', + * '<p>{name}</p>', + * '<p>Dad: {parent.name}</p>', + * '</tpl>', + * '</tpl></p>' + * ); + * tpl.overwrite(panel.body, data); + * + * # Conditional processing with basic comparison operators + * + * The **tpl** tag and the **if** operator are used to provide conditional checks for deciding whether or not to render + * specific parts of the template. Notes: + * + * - Double quotes must be encoded if used within the conditional + * - There is no else operator -- if needed, two opposite if statements should be used. + * + * Examples: + * + * <tpl if="age > 1 && age < 10">Child</tpl> + * <tpl if="age >= 10 && age < 18">Teenager</tpl> + * <tpl if="this.isGirl(name)">...</tpl> + * <tpl if="id==\'download\'">...</tpl> + * <tpl if="needsIcon"><img src="{icon}" class="{iconCls}"/></tpl> + * // no good: + * <tpl if="name == "Tommy"">Hello</tpl> + * // encode " if it is part of the condition, e.g. + * <tpl if="name == "Tommy"">Hello</tpl> + * * Using the sample data above: - * <pre><code> -var tpl = new Ext.XTemplate( - '<p>Name: {name}</p>', - '<p>Kids: ', - '<tpl for="kids">', - '<tpl if="age &gt; 1">', - '<p>{name}</p>', - '</tpl>', - '</tpl></p>' -); -tpl.overwrite(panel.body, data); - </code></pre> - * </div> - * </li> - * - * - * <li><b><u>Basic math support</u></b> - * <div class="sub-desc"> - * <p>The following basic math operators may be applied directly on numeric - * data values:</p><pre> - * + - * / - * </pre> + * + * var tpl = new Ext.XTemplate( + * '<p>Name: {name}</p>', + * '<p>Kids: ', + * '<tpl for="kids">', + * '<tpl if="age > 1">', + * '<p>{name}</p>', + * '</tpl>', + * '</tpl></p>' + * ); + * tpl.overwrite(panel.body, data); + * + * # Basic math support + * + * The following basic math operators may be applied directly on numeric data values: + * + * + - * / + * * For example: - * <pre><code> -var tpl = new Ext.XTemplate( - '<p>Name: {name}</p>', - '<p>Kids: ', - '<tpl for="kids">', - '<tpl if="age &gt; 1">', // <-- Note that the > is encoded - '<p>{#}: {name}</p>', // <-- Auto-number each item - '<p>In 5 Years: {age+5}</p>', // <-- Basic math - '<p>Dad: {parent.name}</p>', - '</tpl>', - '</tpl></p>' -); -tpl.overwrite(panel.body, data); - </code></pre> - * </div> - * </li> - * - * - * <li><b><u>Execute arbitrary inline code with special built-in template variables</u></b> - * <div class="sub-desc"> - * <p>Anything between <code>{[ ... ]}</code> is considered code to be executed - * in the scope of the template. There are some special variables available in that code: - * <ul> - * <li><b><tt>values</tt></b>: The values in the current scope. If you are using - * scope changing sub-templates, you can change what <tt>values</tt> is.</li> - * <li><b><tt>parent</tt></b>: The scope (values) of the ancestor template.</li> - * <li><b><tt>xindex</tt></b>: If you are in a looping template, the index of the - * loop you are in (1-based).</li> - * <li><b><tt>xcount</tt></b>: If you are in a looping template, the total length - * of the array you are looping.</li> - * </ul> - * This example demonstrates basic row striping using an inline code block and the - * <tt>xindex</tt> variable:</p> - * <pre><code> -var tpl = new Ext.XTemplate( - '<p>Name: {name}</p>', - '<p>Company: {[values.company.toUpperCase() + ", " + values.title]}</p>', - '<p>Kids: ', - '<tpl for="kids">', - '<div class="{[xindex % 2 === 0 ? "even" : "odd"]}">', - '{name}', - '</div>', - '</tpl></p>' - ); -tpl.overwrite(panel.body, data); - </code></pre> - * </div> - * </li> - * - * <li><b><u>Template member functions</u></b> - * <div class="sub-desc"> - * <p>One or more member functions can be specified in a configuration - * object passed into the XTemplate constructor for more complex processing:</p> - * <pre><code> -var tpl = new Ext.XTemplate( - '<p>Name: {name}</p>', - '<p>Kids: ', - '<tpl for="kids">', - '<tpl if="this.isGirl(name)">', - '<p>Girl: {name} - {age}</p>', - '</tpl>', - // use opposite if statement to simulate 'else' processing: - '<tpl if="this.isGirl(name) == false">', - '<p>Boy: {name} - {age}</p>', - '</tpl>', - '<tpl if="this.isBaby(age)">', - '<p>{name} is a baby!</p>', - '</tpl>', - '</tpl></p>', - { - // XTemplate configuration: - compiled: true, - // member functions: - isGirl: function(name){ - return name == 'Sara Grace'; - }, - isBaby: function(age){ - return age < 1; - } - } -); -tpl.overwrite(panel.body, data); - </code></pre> - * </div> - * </li> * - * </ul></div> + * var tpl = new Ext.XTemplate( + * '<p>Name: {name}</p>', + * '<p>Kids: ', + * '<tpl for="kids">', + * '<tpl if="age > 1">', // <-- Note that the > is encoded + * '<p>{#}: {name}</p>', // <-- Auto-number each item + * '<p>In 5 Years: {age+5}</p>', // <-- Basic math + * '<p>Dad: {parent.name}</p>', + * '</tpl>', + * '</tpl></p>' + * ); + * tpl.overwrite(panel.body, data); + * + * # Execute arbitrary inline code with special built-in template variables + * + * Anything between `{[ ... ]}` is considered code to be executed in the scope of the template. There are some special + * variables available in that code: + * + * - **values**: The values in the current scope. If you are using scope changing sub-templates, + * you can change what values is. + * - **parent**: The scope (values) of the ancestor template. + * - **xindex**: If you are in a looping template, the index of the loop you are in (1-based). + * - **xcount**: If you are in a looping template, the total length of the array you are looping. + * + * This example demonstrates basic row striping using an inline code block and the xindex variable: * - * @param {Mixed} config + * var tpl = new Ext.XTemplate( + * '<p>Name: {name}</p>', + * '<p>Company: {[values.company.toUpperCase() + ", " + values.title]}</p>', + * '<p>Kids: ', + * '<tpl for="kids">', + * '<div class="{[xindex % 2 === 0 ? "even" : "odd"]}">', + * '{name}', + * '</div>', + * '</tpl></p>' + * ); + * tpl.overwrite(panel.body, data); + * + * # Template member functions + * + * One or more member functions can be specified in a configuration object passed into the XTemplate constructor for + * more complex processing: + * + * var tpl = new Ext.XTemplate( + * '<p>Name: {name}</p>', + * '<p>Kids: ', + * '<tpl for="kids">', + * '<tpl if="this.isGirl(name)">', + * '<p>Girl: {name} - {age}</p>', + * '</tpl>', + * // use opposite if statement to simulate 'else' processing: + * '<tpl if="this.isGirl(name) == false">', + * '<p>Boy: {name} - {age}</p>', + * '</tpl>', + * '<tpl if="this.isBaby(age)">', + * '<p>{name} is a baby!</p>', + * '</tpl>', + * '</tpl></p>', + * { + * // XTemplate configuration: + * disableFormats: true, + * // member functions: + * isGirl: function(name){ + * return name == 'Sara Grace'; + * }, + * isBaby: function(age){ + * return age < 1; + * } + * } + * ); + * tpl.overwrite(panel.body, data); */ - Ext.define('Ext.XTemplate', { /* Begin Definitions */ extend: 'Ext.Template', - statics: { - /** - * Creates a template from the passed element's value (<i>display:none</i> textarea, preferred) or innerHTML. - * @param {String/HTMLElement} el A DOM element or its id - * @return {Ext.Template} The created template - * @static - */ - from: function(el, config) { - el = Ext.getDom(el); - return new this(el.value || el.innerHTML, config || {}); - } - }, - /* End Definitions */ argsRe: /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/, @@ -373,11 +325,18 @@ Ext.define('Ext.XTemplate', { var me = this, t = me.tpls[id]; return t.compiled.call(me, values, parent, xindex, xcount); }, + /** - * @cfg {RegExp} codeRe The regular expression used to match code variables (default: matches <tt>{[expression]}</tt>). + * @cfg {RegExp} codeRe + * The regular expression used to match code variables. Default: matches {[expression]}. */ codeRe: /\{\[((?:\\\]|.|\n)*?)\]\}/g, + /** + * @cfg {Boolean} compiled + * Only applies to {@link Ext.Template}, XTemplates are compiled automatically. + */ + re: /\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\/]\s?[\d\.\+\-\*\/\(\)]+)?\}/g, // @private @@ -485,31 +444,20 @@ Ext.define('Ext.XTemplate', { return this; }, - /** - * Returns an HTML fragment of this template with the specified values applied. - * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) - * @return {String} The HTML fragment - */ + // inherit docs from Ext.Template applyTemplate: function(values) { return this.master.compiled.call(this, values, {}, 1, 1); }, /** - * Compile the template to a function for optimized performance. Recommended if the template will be used frequently. - * @return {Function} The compiled function + * Does nothing. XTemplates are compiled automatically, so this function simply returns this. + * @return {Ext.XTemplate} this */ compile: function() { return this; } }, function() { - /** - * Alias for {@link #applyTemplate} - * Returns an HTML fragment of this template with the specified values applied. - * @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'}) - * @return {String} The HTML fragment - * @member Ext.XTemplate - * @method apply - */ + // re-create the alias, inheriting it from Ext.Template doesn't work as intended. this.createAlias('apply', 'applyTemplate'); });