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。