Prototype Template对象 学习


Posted in Javascript onJuly 19, 2009
var Template = Class.create({ 
//初始化方法 
initialize: function(template, pattern) { 
this.template = template.toString(); 
this.pattern = pattern || Template.Pattern; 
}, //格式化方法,如果从java的角度来说,其实叫format更好 :) 
evaluate: function(object) { 
    //检查是否定义了toTemplateReplacements方法,是的话调用 
    //整个的Prototype框架中,只有Hash对象定义了这个方法 
if (object && Object.isFunction(object.toTemplateReplacements)) 
object = object.toTemplateReplacements(); 
    //这里的gsub是String对象里面的方法,可以简单的认为就是替换字符串中所有匹配pattern的部分 
return this.template.gsub(this.pattern, function(match) { 
//match[0]是整个的匹配Template.Pattern的字符串 
     //match[1]是匹配字符串前面的一个字符 
     //match[2]是匹配${var}这个表达式的部分 
     //match[3]是'#{var}'表达式的'var'部分 
     //如果object为null,则把所有的${var}表达式替换成'' 
if (object == null) return (match[1] + ''); 
     //取得匹配表达式前一个字符 
var before = match[1] || ''; 
     //如果前一个字符串为'\',则直接返回匹配的表达式,不进行替换 
if (before == '\\') return match[2]; 
var ctx = object, expr = match[3]; 
     //这个正则表达式好像就是检查var是否是合法的名称,暂时没看懂这个正则表达式的意义? 
var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; 
match = pattern.exec(expr); 
     //如果var不符合要求,则直接返回前一个字符 
if (match == null) return before; 
//逐个替换'#{var}'表达式部分 
while (match != null) { 
         //不懂下面这个检查什么意思? 
var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; 
ctx = ctx[comp]; 
if (null == ctx || '' == match[3]) break; 
expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); 
match = pattern.exec(expr); 
} 
     //返回替换后的结果,'#{var}' ==> 'value' 
return before + String.interpret(ctx); 
}); 
} 
}); 
//默认的模板匹配正则表达式,形如#{var},很像JSP中的EL表达式 
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;

上面基本上把evaluate方法讲了一遍,有些地方没怎么看明白,那些正则表达式太难懂了。。。谁知道的告诉我?

下面看一下示例:

var myTemplate = new Template('The TV show #{title} was created by #{author}.'); var show = {title: 'The Simpsons', author: 'Matt Groening', network: 'FOX' }; 
myTemplate.evaluate(show); 
// -> The TV show The Simpsons was created by Matt Groening.

var t = new Template('in #{lang} we also use the \\#{variable} syntax for templates.'); 
var data = {lang:'Ruby', variable: '(not used)'}; t.evaluate(data); 
// -> in Ruby we also use the #{variable} syntax for templates.

//自定义匹配模式 
var syntax = /(^|.|\r|\n)(\<%=\s*(\w+)\s*%\>)/; //matches symbols like '<%= field %>' 
var t = new Template('<div>Name: <b><%= name %></b>, Age: <b><%=age%></b></div>', syntax); 
t.evaluate( {name: 'John Smith', age: 26} ); 
// -> <div>Name: <b>John Smith</b>, Age: <b>26</b></div>
var conversion1 = {from: 'meters', to: 'feet', factor: 3.28}; 
var conversion2 = {from: 'kilojoules', to: 'BTUs', factor: 0.9478}; 
var conversion3 = {from: 'megabytes', to: 'gigabytes', factor: 1024}; var templ = new Template('Multiply by #{factor} to convert from #{from} to #{to}.'); 
[conversion1, conversion2, conversion3].each( function(conv){ templ.evaluate(conv); }); 
// -> Multiply by 3.28 to convert from meters to feet. 
// -> Multiply by 0.9478 to convert from kilojoules to BTUs. 
// -> Multiply by 1024 to convert from megabytes to gigabytes.
Javascript 相关文章推荐
jquery $.ajax入门应用一
Nov 19 Javascript
关于全局变量和局部变量的那些事
Jan 11 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
Aug 13 Javascript
jQuery应用之jQuery链用法实例
Jan 19 Javascript
理解JavaScript中Promise的使用
Jan 18 Javascript
获取JS中网页各种高宽与位置的方法总结
Jul 27 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
Oct 14 Javascript
JavaScript之class继承_动力节点Java学院整理
Jul 03 Javascript
jQuery中使用validate插件校验表单功能
May 24 jQuery
Webpack 4如何动态切割JS注入文件名详解
Jul 09 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
Dec 10 Javascript
Prototype Number对象 学习
Jul 19 #Javascript
Prototype ObjectRange对象学习
Jul 19 #Javascript
Prototype RegExp对象 学习
Jul 19 #Javascript
Prototype Class对象学习
Jul 19 #Javascript
javascript iframe内的函数调用实现方法
Jul 19 #Javascript
9个javascript语法高亮插件 推荐
Jul 18 #Javascript
Google Map Api和GOOGLE Search Api整合实现代码
Jul 18 #Javascript
You might like
php在线打包程序源码
2008/07/27 PHP
让PHP支持断点续传的源码
2010/05/16 PHP
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
js中replace的用法总结
2013/12/27 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
python使用多线程不断刷新网页的方法
2015/03/31 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
新闻专业应届生求职信
2013/10/31 职场文书
党风廉政承诺书
2014/03/27 职场文书
道德之星事迹材料
2014/05/03 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
Pytorch 实现变量类型转换
2021/05/17 Python