標籤:

請問如何處理tornado模板和angular.js的 {{ }} 表達式衝突問題?


Angular 從1.0開始就支持用$interpolateProvider自定義分隔符 http://docs.angularjs.org/api/ng.%24interpolateProvider

因為Angular原生支持自定義分隔符, 而一些後端的模板語言不支持自定義分隔符,個人傾向於在Angular端自定義分隔符。 雖然有各種hack可以讓前後端都用{{ }} 做分隔符,但這會讓前後端的代碼更難辨別,不好維護,所以不推薦在後端模板和混用相同的分隔符。

&
&
&
&

首先添加一個類

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)

然後在_parse函數里找到

elif operator in ("extends", "include", "set", "import", "from")

這樣的一行,在這個條件下加上

# for AngularJS
elif operator == "plain":
suffix = suffix.strip(""" ")
block = _Plain(suffix, reader, line)

PS:後來想了下plain這個名字不太好,用literal吧。


不知道題主為什麼會有這樣的需求,照理說,前端使用了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的路線。


推薦閱讀:

TAG:Tornado | AngularJS |