Handlebars.registerHelper('param', function(key, options){
var url = location.href.replace(/^[^?=]*\?/ig, '').split('#')[0];
var json = {};
url.replace(/(^|&)([^&=]+)=([^&]*)/g, function (a, b, key , value){
try {
key = decodeURIComponent(key);
} catch(e) {}
try {
value = decodeURIComponent(value);
} catch(e) {}
if (!(key in json)) {
json[key] = /\[\]$/.test(key) ? [value] : value;
}
else if (json[key] instanceof Array) {
json[key].push(value);
}
else {
json[key] = [json[key], value];
}
});
return key ? json[key] : json;
});
<a href="detail.html?id={{param id}}">设备详细信息</a>
这样就方便多了!可是这么作有没有问题呢?实际上是有些不完美的,若是你考虑“性能”二字的话。一个url中参数的值是固定的,而你每次使用这个helper都会计算一遍,白白作了多余的事情。若是handlebars能够在模板中定义常量就行了,惋惜我找遍文档没发现有这个功能。只能为了方便牺牲性能了,也正印证了我标题中所说的“简单粗暴”,呵呵。
数据的校验和处理
因为数据是由后端传来的,有不少不肯定性,数据可能不合法,或者结构有错,或者直接是空的。所以前端有必要对数据作一个合法性的校验。借助handlebars,能够很方便的进行数据校验。没错,就是利用helper。handlebars内置的helper如if、each都支持else语句,出错信息能够在else中输出。若是须要个性化的校验,咱们能够本身定义helper来完成,关于如何自定义helper,我以前研究了下,写过一篇文章:
http://www.cnblogs.com/lvdabao/p/handlebars_helper.html。总之自定义helper很强大,能够完成你所需的任何逻辑。
数据的格式化,如日期、数字等,也能够经过helper来完成。
另一方面,前端还应对数据进行html转义,避免xss,因为handlebars已经给作了html转义,因此咱们能够直接忽略此项了。
总结
本文是我刚刚参加完一个项目后所写,记录一下整个过程遇到的问题及处理方式,其余的一些细碎点如表单异步提交什么的,不是本文重点,不写了。这是我第一次实践先后端彻底分离的项目,整个前端全由我来设计、开发。2周时间,凭着这套方案,项目定期开发完成,并且还提早完成了,预留出一天多的时间测试了一遍。
虽然开发任务是完成了,可是回头看一下整个方案,并非很优雅也没有什么技术含量,文章开头提到的几个问题都没有解决。因此命题为简单粗暴的方案,都是为了赶工期啊。
最后,若是给我再来一次的机会,而且时间充足,我必定要尝试用mv*方案来搞一下,或angular,或avalon。