Prototype Template對象 學習

來源:互聯網
上載者:User

複製代碼 代碼如下: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];
//這個Regex好像就是檢查var是否是合法的名稱,暫時沒看懂這個Regex的意義?
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);
});
}
});
//預設的模板匹配Regex,形如#{var},很像JSP中的EL運算式
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;

上面基本上把evaluate方法講了一遍,有些地方沒怎麼看明白,那些Regex太難懂了。。。誰知道的告訴我?

下面看一下樣本: 複製代碼 代碼如下: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.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.