4

Jinja2マクロを呼び出し元のテンプレートの別の部分に出力しようとしています。これを実行したい理由は、マクロの一部としてインラインJavascriptがあるためですが、テンプレートの最後にすべてのJavascriptが必要です。私は基本的にこのようなことをしたい

{% 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

2 に答える 2

4

あなたがジンジャで求めていることをすることが可能かどうかはわかりません。しかし、私は別のアプローチが機能し、より簡単な解決策を提供するかもしれないと思います:

次のようなマークアップを生成する代わりに

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

各ツールチップのIDが次のようにハードコードされた対応するjQuery呼び出し

<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コードは、「ベース」テンプレートの下部に1回含めることができるため、すべてのページで使用でき、Jinjaマクロから2つの別々のブロックに書き込む方法を理解する必要はありません。

于 2010-11-22T17:52:12.647 に答える
1

2つの機能に分けてもらえますか?たとえば、マークアップを出力するものとjavascriptを出力するものは?それが私が見る最も簡単な方法です。ユースケースにもよりますが、それも「正しい方法」だと思います。

于 2012-08-08T02:46:19.523 に答える