2012-10-17 64 views
4

如果處理程序返回變量與模板一起:是否可以在Tornado中基於模板變量運行JavaScript代碼?

self.render('page.html', enabled=enabled) 

其中enabled是一個布爾變量。

到目前爲止,我知道我可以做這樣的事情:在模板的HTML部分中

{% if enabled %} 
    ... 
{% end %} 

但是我們是否可以在Tornado模板中有條件地運行一些基於此enabled變量的JavaScript代碼?換句話說,我們可以在嵌入模板的JavaScript中訪問這個變量的值嗎?

回答

6

當然 - 無論{% if ... %}{ % end %}指令之間的模板內容是否只有在if表達式爲True時纔會發送到瀏覽器。因此,任何內容,無論是內嵌JavaScript的<script >標記,還是從某處導入JavaScript文件的<link>標記,都只能通過網絡傳輸。

您甚至可以在Javascript代碼本身內部放置一個模板iffor指令,以基於服務器代碼已知的條件啓用或禁用部分代碼。這個,unlinke嵌入或不是一個完整的代碼片段,我認爲不會被認爲是一個好的實踐 - 因爲它會以不希望的方式糾纏你的代碼的服務器端和客戶端。

從JavaScript訪問變量,只是做:啓用

VAR = {{啓用}};

{{...}}標記內的值使用服務器變量呈現。

在這種情況下,爲保證值enabled是不同的Python和JavaScript兼容的,你應該使用數字0爲真(假,1,因爲如果你使用Python布爾值,該模板將呈現爲 var enabled = True; - 這不是javascript所期待的,因爲Javascript中保留的「true」是小寫)

唯一的限制是您只能在頁面發送到瀏覽器之前設置服務器端變量。因此,如果您需要在服務器端設置任何取決於用戶在所顯示頁面上的操作的變量,這種做法不會再削減它(僅在頁面重新加載時)。使頁面交互更新而不重新加載的方式是依賴於來自javascript(以前稱爲「ajax」)的異步通信。

編輯 - 在OP進一步問:

這裏有一個問題:當我返回一個字符串變量如 MYVAR =「富巴」的模板,並在此{{MYVAR }}在JS代碼中得到評估 ,JS顯然將foo-bar解釋爲變量名稱 而不是字符串。在這種情況下,它會導致錯誤,因爲 - 表示減法。我如何讓JS識別foo-bar作爲字符串 的值?

再次,這是怎麼回事是相當簡單:{{ <expr> }}模板操作員將rsulting表達的 字符串表示 - 所以,如果你有蟒蛇 myvar = "bla"和模板var myvar = {{ myvar }},即獲取呈現(和發以這種方式到客戶端瀏覽器)爲var myvar = bla - bla附近沒有引號 - 這就是爲什麼javascript將其視爲變量名。如果它是一個字符串,無論是在Python端還是在模板上,這個變通方法都會在變量中加上額外的引號。

的模板,你可以這樣做: var myvar="{{ myvar }}" - 或者,在Python端,定義MYVAR時:myvar = '"%s"' % "bla"

+0

感謝您的回答,但這裏有一個問題:當我返回一個字符串,變量'MYVAR ='foo-bar'到模板中,當這個'{{myvar}}'在JS代碼中得到評估時,JS顯然將'foo-bar'解釋爲*變量名*而不是*字符串*。在這種情況下,它會導致錯誤,因爲'-'表示減法。我如何讓JS將'foo-bar'識別爲字符串值? – MLister

相關問題