請問如何處理tornado模板和angular.js的 {{ }} 表達式衝突問題?
Angular 從1.0開始就支持用$interpolateProvider自定義分隔符 http://docs.angularjs.org/api/ng.%24interpolateProvider
因為Angular原生支持自定義分隔符, 而一些後端的模板語言不支持自定義分隔符,個人傾向於在Angular端自定義分隔符。 雖然有各種hack可以讓前後端都用{{ }} 做分隔符,但這會讓前後端的代碼更難辨別,不好維護,所以不推薦在後端模板和混用相同的分隔符。&
&
&
&
&
&
&
&
//demo.label//
&
&
var customInterpolationApp = angular.module("customInterpolationApp", []);
customInterpolationApp.config(function($interpolateProvider) {
$interpolateProvider.startSymbol("//");
$interpolateProvider.endSymbol("//");
});
customInterpolationApp.controller("DemoController", function DemoController() {
this.label = "This bindings is brought you you by // interpolation symbols.";
});
我們的解決方法是修改tornado的模板引擎,加入了一個plain關鍵字。通過像
{% plain "some_angular_template.html" %}
這種方式來包含模板,裡面的的{{}}標記不會被解析。
首先添加一個類
class _Plain(_Node):
def __init__(self, name, reader, line):
self.name = name
self.reader = reader
self.line = line
def generate(self, writer):
name = self.name
name = writer.loader.resolve_path(name, self.reader.name)
name = os.path.join(writer.loader.root, name)
content = open(name, "r").read()
writer.write_line("_pool_append(%r)" % to_str(content), self.line)
elif operator in ("extends", "include", "set", "import", "from")
# for AngularJS
elif operator == "plain":
suffix = suffix.strip(""" ")
block = _Plain(suffix, reader, line)
不知道題主為什麼會有這樣的需求,照理說,前端使用了ng之類的框架後,後端是完全沒有必要動態輸出帶前端(ng)模板語法的html代碼的,兩個模板語法的生效位置都不一樣(一個在後端一個在前端)。即使有,也肯定不會太多,完全可以用字元串拼接的形式繞過,而不需要更改模板插值語法,這會導致可維護性降低。
題主可以說說具體的場景讓大家分析一下,到底是什麼場景需要後端輸出帶模板的前端代碼。可能是你的實踐方式不太正確也說不定。還有一種規避方案是用ng-bind 替代兩個花括弧,比如:
{{name}}&&
&&
angularjs的模板全部保存為獨立的html文件,由nginx直接去獲取?
如果說,需要通過tornado去動態生成angularjs的模板,那麼是否可以考慮重構代碼去避免這種情況發生?
{{! name }}
前後端分離,不使用任何後端模板,不管是tornado的模板還是jinja2/mako, 統統幹掉。前後端通過api返回json數據進行通信。
其實完全可以定義一個長字元串,將字元串替換到模板中,改變轉意規則不就可以了。如果感覺字元串中有需要替換的,自己寫幾句替換的代碼,二次模板。
直接去改tornado模板渲染部分源代碼 就幾行代碼 改成另外一個你自己想要的的標記 比如「{@ @}」
定義個函數:
def notrans(s):
return "{{"+s+"}}"
然後在html中花括弧中內容傳給這個函數,然後Tornado模板處理過後,花括弧又原樣輸出了
Ankazen#x27;s Page
angular是為富客戶端而生的產物,個人傾向於把tornado變成一個restful伺服器。所以前端工程應該是放在apache下更佳,不應該與tornado放到一起。
隨著TSA的流行,應用伺服器逐漸走向輕量化。如果僅僅作為WEB工程,個人不建議重度使用angular。應該考慮SEO的優化,走freemaker的路線。推薦閱讀: