在个人上一篇博文《String扩展之Format》中对String扩展了Format方法以应对复杂的字符串替换功能。这个方法其实已经构成了模板引擎的基础部分。
app
而模板引擎的第二步就是增长参数替换以及方法处理。以使得数据逻辑和UI绘制进行分离。。ide
老规矩。核心代码奉上。ui
// class TemplateBuilder var TemplateBuilder = function (owner) { //constructor this.owner = owner; } TemplateBuilder.prototype = (function () { //private var methodMapping = { Test:function(value){ return value+" run in test method" } } //处理方法映射 var BuildTemplateHtml = function (templateHtml, paramObj) { var exp = new RegExp("{([^{]*?)}", "ig"); var returnValue = templateHtml; var result = exp.exec(returnValue); while (result) {//循环直到没有剩余符合模板规律的字符串 result = result[1]; var replaceSetting = { key: result, value: "" } var splits = result.split(":"); var objType = splits[0]; var paramName = splits[1]; var mappingMethodStr = splits[2]; var obj = null; //取得参数对象 if(paramObj&¶mObj[objType])obj=paramObj[objType]; var value = null; if (obj) { value = TemplateHelper.GetParam(obj, paramName); } //是否配置了调用模板处理方法 if (mappingMethodStr) { var paramExp = /\((.*?)\)/ig; var mappingMethodName = mappingMethodStr.replace(paramExp, ""); var method = methodMapping[mappingMethodName]; if (method) { var params = [value]; var methodParam = paramExp.exec(mappingMethodStr); if (methodParam && methodParam.length > 1) { methodParam = methodParam[1]; params = params.concat(methodParam.split(","));//取得参数 } value = method.apply(this, params);//调用方法 } } if (!value) { value = "" } replaceSetting.value = value; ; returnValue = returnValue.Format(replaceSetting); exp.lastIndex = 0; result = exp.exec(returnValue); } return returnValue; } var returnValue = { //public owner: null, BuildTemplate: function (strTemplate, paramObj) { return BuildTemplateHtml.call(this, strTemplate, paramObj); } }; return returnValue; })();
这里使用到了一个帮助类TemplateHelperthis
代码以下prototype
var TemplateHelper = { GetParam: function (sourceObj, strParam) { var strs = strParam.split("."); var returnValue = null; for (var i = 0; i < strs.length; i++) { if (!returnValue) { returnValue = sourceObj; } returnValue = returnValue[strs[i]]; if (!returnValue) { break; } } if (!returnValue) { returnValue = $.trim(returnValue); } return returnValue; } }
点我 看Demo
code