2013-07-26 21 views
0

我對jinja2相對較新(並且絕不是Web開發專家),並且我無法獲取與jinja模板關聯的JavaScript來重新加載(並更新其變量),這取決於程序。如何重新加載jinja模板的JavaScript?

從本質上講,我有一個模板,通過項目列表迭代:

{% for item in items %} 
<p> {{item['property a']}}</p> 
blah blah blah` 

,然後我調用另一個模板,我內進口的循環:

{% import 'secondTemplate.html' as s %} //not sure whether this matters if it goes inside or outside the for loop 
<p> {{s.doSecondStuff(item)}}</p> 

這所有的作品。第二個模板每次執行每個項目,這是我想要的。

但是,我有一些secondTemplate.js與secondTemplate.html相關聯,它對傳遞給secondTemplate.html的變量進行操作。我的問題是secondTemplate.js只能處理第一個項目的值。

這似乎是從Loading external script with jinja2 template directive頂端回答會的工作,所以我一直在試圖把在下面的for循環:

{% block javascript %} 
    <script type="text/javascript"> 
     {% include "secondTemplate.js" %} 
    </script> 
{% endblock %} 

但爵士仍是隻反映了第一個項目的值在列表中。

任何想法?謝謝!

+1

你的JavaScript看起來像/做什麼? – Trendy

+1

你能提供完整的模板代碼嗎?我在下面寫了一個答案,你可能會覺得有用,但它不能回答你的問題。 –

+0

對我來說,似乎你正在混合服務器端和客戶端處理。 'secondTemplate.js'做什麼**完全**?你爲什麼不在服務器上用Python做到這一點?你真的**在那裏做什麼?不要抽象!告訴我們你最終想達到的目標。 – dAnjou

回答

1

我不熟悉jinja,但是如果你想重新加載js文件(如果我理解你的話),下面有一個技巧。讓我們製作所有帶有ID的標籤,例如:

<script src="be/happy.js" id ="be/happy.js"></script> 
<script src="be/very/happy.js" id ="be/very/happy.js"></script> 

等等。現在是線索。我們可以強制瀏覽器重新加載文件,使用這種方法:

var s = document.getElementById('be/happy.js'); //get access to node 
d.parentNode.removeChild(s); //remove it from document 
delete d; //destroy element 

d = document.createElement('script'); //create new script tag 
d.src = d.id = 'be/happy.js'; //add the same value to id and src attribute 
document.getElementsByTagName('head')[0].appendChild(d); //append child again, what force browser to script reload 
2

如果您使用瀏覽器打開你的瓶應用,瓶看起來通過您定義的路線,並選擇它找到最合適的一個,例如:

@app.route('/<name>') 
def index(name): 
    return render_template('index.htm', var1=name) 

它在任何編程語言中都像普通函數一樣執行函數內部。這裏是重點:函數只返回一串HTML。它沒有做任何「魔術」來將任何關於變量名稱的信息傳遞給瀏覽器。要具體,如果index.htm是這樣的:

<h1>Hello {{ name }}!</h1> 

然後render_template('index.htm', name="world")返回一個字符串與內容"<h1>hello world!</h1>",這是你的看法的回報,這是什麼瓶給瀏覽器。

因此,瀏覽器,因此你的Javascript代碼,有絕對不知道HTML的哪一部分是變量,哪些不是。當您在瀏覽器中執行Javascript時,您的Flask應用程序已經忘記了客戶端以及它給出的值name

真的不清楚你在問什麼,但我希望我明確告訴你,你試圖達到的目標是不可能的。