2010-11-22 56 views
3

我試圖讓Jinja2宏輸出到調用模板的不同部分。我想這樣做的原因是因爲內嵌Javascript是宏的一部分,但我希望在模板末尾使用所有Javascript。基本上,我想要做這樣的事情Jinja宏訪問不同的塊

{% import 'tooltip.html' as tooltip %} 
<html> 
    <body> 
    {% block contents %} 
    {% tooltip('mytool') %} 
    {% endblock %} 
    <script> 
     {% block javascript %} 
     {% endblock %} 
    </script> 
    </body> 
</html> 

而在宏文件

{% macro tooltip(name) %} 
    <div id='{{ name }}'> 
    This is my tooltip 
    </div> 

    {% block javascript %} 
    jQuery("#{{ name }}").click(function(){//do something}); 
    {% endblock %} 
{% endmacro %} 

所以,最終的結果會是這樣的

<html> 
    <body> 
    <div id='mytool'> 
     This is my tooltip 
    </div> 
    <script> 
     jQuery("#mytool").click(function(){//do something}); 
    </script> 
    </body> 
</html> 

我希望我所有的JavaScript末我的模板,但宏似乎只是回到那裏。

有什麼我失蹤或超出標準Jinja2,並需要寫一個擴展嗎?

謝謝

回答

4

我不確定是否有可能在金賈做你想問的問題。但我認爲不同的方法可能會奏效,並提供一個簡單的解決方案:

代替生成的標記像

<div id='mytool'> 
    This is my tooltip 
</div> 

和相應的jQuery調用每個工具提示的ID硬編碼像

<script> 
    jQuery("#mytool").click(function(){}); 
</script> 

爲每一個頁面上的工具提示,給每個工具提示一個class屬性,並使jQuery功能在所有class元素上工作。這樣,每個頁面都可以具有相同的jQuery通用位,並且無論工具提示出現在特定頁面上如何工作。

更多的東西一樣:

<div id="mytool" class="tooltip"> 
    This is my tooltip 
</div> 

加上一個更通用的jQuery的電話:

<script> 
    // This will add the onclick handler to any element 
    // with a class of "tooltip" 
    jQuery(".tooltip").click(function(){}); 
</script> 

這個jQuery代碼可以被包含一次,在你的「基地」模板的底部,因此,它的可在每個頁面上使用,而且您不必知道如何寫入Jinja宏的兩個獨立塊。

+0

沒錯,那是個好主意。不幸的是,我想要做的事情是要求JavaScript從模板中獲得一些邏輯,這在每個工具提示中都是獨一無二的。我應該在我的例子中更清楚,但我想保持簡單。是的,我看到的越多,Jinja2看起來就越不可能,或許可以考慮重組。謝謝 – 2010-11-22 18:29:56

1

你能把它分成2個功能嗎?喜歡,一個輸出標記和一個輸出JavaScript?這將是我看到的最簡單的方法。這一切都取決於你的用例,但我認爲這也是「正確的方式」。