前几次对模板技术进行了分析和编写,发现不是很合理,现在发上新的改良代码:
/**
* @Author Dike.Li
* @Date 2015/7/30
* @class Template
* @public
* @Description Template Label Replace
*/
define(function (require) {
/**
* 提取模板中 XXX=‘{XXX}‘ || XXX="{XXX}"
* @type {RegExp}
*/
var regExp = new RegExp(‘[a-zA-Z]+[\\s]*=[\\s]*[\"\‘]\\{[^\\{\\}]+\\}[\"\‘]‘, ‘\g‘);
/**
* 提取标签正则表达式 {XXX}
* @type {RegExp}
*/
var regExpLable = new RegExp(‘\\{[^\\{\\}]+\\}‘, ‘\g‘);
/**
* 提取标签中的名称 {XXX} -> XXX
* @type {RegExp}
*/
var regExpLabelName = new RegExp(‘[^\\{\\}]+‘, ‘\g‘);
/**
* 将数组转换为字符串
* @param str
* @returns {*}
*/
var convertString = function (obj) {
var str = null;
if (obj instanceof Array) {
str = obj.join(‘‘);
}
return str;
};
/**
* 要求模板中的{id}标签与option中的属性{id:123}一致
* @param temp 模板
* @param option 属性设置
* @returns {*}
* @constructor
*/
var getTemp = function (temp, option) {
/**
* 进行类型处理
* @type {*}
*/
temp = convertString(temp);
/**
* 提取 XXX=‘{XXX}‘ || XXX="{XXX}" 格式的数组
* @type {Array|{index: number, input: string}|*}
*/
var alArr = temp.match(regExp);
/**
* 根据option中的属性配置项翻译模板内容,并将不存在的标签删除
*/
for (var al in alArr) {
/**
* 获取标签
*/
var label = alArr[al].match(regExpLable)[0];
/**
* 获取标签名称
*/
var labelName = label.match(regExpLabelName)[0];
if (typeof(option[labelName]) === ‘undefined‘ ||
option[labelName] === null ||
option[labelName] === ‘null‘ ||
option[labelName] === ‘‘) {
temp = temp.replace(alArr[al], ‘‘);
continue;
}
temp = temp.replace(label, option[labelName]);
}
return temp;
};
return {
getTemp: getTemp
}
});
使用方法:
var temp = [‘<div class="login-main">‘,
‘<div class="login-top"><img src="images/login-top.png" width="471" height="91" /></div>‘,
‘<div class="dl-top">‘,
‘<p><span class="dl-wz">用户名:</span><span><input id="{username}" type="text" class="dl-anniu"/></span></p>‘,
‘<p><span class="dl-wz">密码:</span><span><input id="{password}" type="text" class="dl-anniu" /></span></p>‘,
‘<p><span class="dl-mima"><input type="checkbox" value="" class="fx-k" /></span><span>记住密码 <a href="#">重置</a></span></p>‘,
‘<p class="denglu-t"><input id="{login_button}" class="login-b"/></p>‘,
‘</div>‘,
‘</div>‘];
var template = require(‘Template‘);
temp = template.getTemp(temp,{
username: ‘username‘,
password:‘password‘,
login_button:‘login_button‘
});
[DikeJS]关于js模板技术,使用requireJS定义模块(四)
原文:http://my.oschina.net/u/2349331/blog/487895