首页 > 语言 > JavaScript > 正文

Prototype Template对象 学习

2024-05-06 14:14:41
字体:
来源:转载
供稿:网友
代码如下:
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);
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选