4

ハンドラーがテンプレートとともに変数を返す場合:

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

ここenabledで、はブール変数です。

これまでのところ、私は次のようなことができることを知っています:

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

テンプレートのHTML部分内。

enabledしかし、Tornadoテンプレートのこの変数に基づいて条件付きでJavaScriptコードを実行できますか?言い換えれば、テンプレートに埋め込まれたjavascriptでこの変数の値にアクセスできますか?

4

1 に答える 1

6

もちろん-{% if ... %}{ % end %}ディレクティブの間のテンプレートにあるものはすべてif、式がTrueの場合にのみブラウザに送信されます。したがって、<script >インラインjavascriptを使用したタグであれ、<link>どこかからjavascriptファイルをインポートするタグであれ、そこにあるものはすべて、その場合はネットワーク経由でのみ送信されます。

テンプレートifまたはforディレクティブをJavascriptコード自体の中に配置して、サーバーコードに認識されている条件に基づいてコードの一部を有効または無効にすることもできます。これは、リンクを解除するか、コード全体ではないので、コードのサーバー側とクライアント側を望ましくない方法で絡ませてしまうため、良い習慣とは見なされないと思います。

javascriptから変数にアクセスするには、次のようにします。

var enabled = {{enabled}};

マーカー内の値{{...}}は、サーバー変数を使用してレンダリングされます。

この場合、値がenabledPythonとJavascriptの間で互換性があることを確認するには、Falseの場合は0、Trueの場合は1を使用する必要があります(Pythonブール値を使用する場合、テンプレートは次のようにレンダリングされます var enabled = True;-これはjavascriptが期待するものではありません、Javascriptで予約されている「true」は小文字であるため)

唯一の制限は、ページがブラウザに送信される前にのみサーバー側の変数を設定できることです。したがって、表示されたページでのユーザーのアクションに依存する変数をサーバー側で設定する必要がある場合、この方法ではそれがカットされなくなります(ページのリロードのみ)。リロードせずにページを相互作用的に更新する方法は、javascript(以前は排他的に「ajax」と呼ばれていた)からの非同期通信に依存することです。

編集-OPはさらに尋ねました:

ここに問題があります。myvar='foo-bar'などの文字列変数をテンプレートに返し、この{{myvar}}がJSコードで評価されると、JSはfoo-barを変数名ではなく変数名として解釈するようです。文字列。この場合、-は減算を表すため、エラーが発生します。JSにfoo-barを文字列値として認識させるにはどうすればよいですか?

繰り返しになりますが、何が起こっているのかは非常に単純です。{{ <expr> }}テンプレート演算子は、結果の式の文字列表現を挿入します。つまり、Python myvar = "bla"とテンプレートを使用している場合は、引用符なしvar myvar = {{ myvar }}でレンダリングされます(この方法でクライアントブラウザーに送信されます)。var myvar = bla周りbla-それがjavascriptがそれを変数名として扱う理由です。この回避策は、Python側またはテンプレートのいずれかで、変数が文字列の場合、変数を引用符で囲むことです。

テンプレートでは、次のことができます var myvar="{{ myvar }}"。-または、Python側では、myvarを定義するときに:myvar = '"%s"' % "bla"

于 2012-10-17T19:41:54.070 に答える