標籤:node.js handlebar 邏輯運算式
前言:
原本糾結於Web 模板,選了Handlebars。後來發現頁面都是弱邏輯的,不支援複雜邏輯運算式。幾乎要放棄之際,想起了Javascript中eval函數。雖然eval函數很強大,強大到可以“憑空”產生對象或執行代碼,但總覺得他破壞了代碼的優雅性。加之"eval"和"evil"(邪惡)長得挺像的。Eval函數的印象不太好,大多數時候將其當做"禁手"。這時候反正也沒有什麼好辦法了。通過Handlebars自訂函數使用eval執行想要的邏輯。以拼接字元的模式來進行邏輯判斷理論上可以如同EL運算式一樣處理頁面上的大部分邏輯。好像效果還不錯哦。
案例:
安裝handlebars
npm install handlebars
還是在我們之前的express項目裡。建兩個檔案。
模板:test_expression.html
<!DOCTYPE html><html><head><meta charset="utf-8"><title></title></head><body>{{#expression '(' x.a'==' 3 '||' x.a'>' 4 ')&&' x.b'>' 1}}green{{else}}red{{/expression}}</body></html>
js代碼:test_expression.js
var fs = require('fs');var hbs = require('handlebars');//主要思想是使用eval執行想要的邏輯。以拼接字元的模式來進行邏輯判斷理論上可以如同EL運算式一樣處理頁面上的大部分邏輯。如:{{#expression a '==' b '&&' c '>' 0}}hbs.registerHelper('expression', function() { var exps = []; try{ //最後一個參數作為展示內容,也就是平時的options。不作為邏輯運算式部分 var arg_len = arguments.length;var len = arg_len-1;for(var j = 0;j<len;j++){exps.push(arguments[j]);}var result = eval(exps.join(' '));if (result) { return arguments[len].fn(this);} else { return arguments[len].inverse(this);} }catch(e){ throw new Error('Handlerbars Helper "expression" can not deal with wrong expression:'+exps.join(' ')+"."); } }); var template = hbs.compile(fs.readFileSync('../templates/test_expression.html').toString());var http =require("http");http.createServer(function(request,response) { var conditions = {x:{a:4,b:2}}; var html = template(conditions); response.writeHead(200, { "Content-Type":"text/html", "charset":"UTF-8" }); response.write(html); response.end();}).listen(3000);
運行CMD命令列模式下進入node.express\test目錄下執行node test_expression.js
可以改變var conditions = {x:{a:4,b:2}}來驗證邏輯運算式。
總結:
萬分感謝能看到這裡的童鞋。上面的內容其實就是一些基本的套頁面流程。著重點在於handlebar的自訂helper功能和解決頁面弱邏輯。個人支援handlebar作者提出的頁面弱邏輯觀點。但是覺得至少得支援下邏輯運算式。否則一個頁面寫一堆if else或其他邏輯運算式衍生代碼,太累人了。一度想要放棄這塊。直到寫出expression標籤,發現前面又有路了。預知後事如何,且聽下回分解。
Node.js開發劄記之二·頁面篇