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 相关文章推荐
JavaScript 事件系统
Jul 22 Javascript
jQuery的选择器中的通配符使用介绍
Mar 20 Javascript
Web表单提交之disabled问题js解决方法
Jan 13 Javascript
jquery $(document).ready()和window.onload的区别浅析
Feb 04 Javascript
JS实现的简洁二级导航菜单雏形效果
Oct 13 Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 Javascript
微信小程序中页面FOR循环和嵌套循环
Jun 21 Javascript
JavaScript调用模式与this关键字绑定的关系
Apr 21 Javascript
垃圾回收器的相关知识点总结
May 13 Javascript
原生JS封装_new函数实现new关键字的功能
Aug 12 Javascript
vue路由拦截器和请求拦截器知识点总结
Nov 08 Javascript
springboot+VUE实现登录注册
May 27 Vue.js
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写的简易聊天室代码
2011/06/04 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
php使用memcoder将视频转成mp4格式的方法
2015/03/12 PHP
php的4种常见运行方式
2015/03/20 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
破解Session cookie的方法
2006/07/28 Javascript
获取body标签的两种方法
2011/10/13 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
2017/10/12 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
django之常用命令详解
2016/06/30 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
python实现ftp文件传输功能
2020/03/20 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
Why do we need Unit test
2013/01/03 面试题
客服专员岗位职责
2014/02/28 职场文书
网络信息安全承诺书
2014/03/26 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
优秀求职信
2014/05/29 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
pytorch查看网络参数显存占用量等操作
2021/05/12 Python
A22国内电台短波广播频率表
2022/05/10 无线电
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis