4

如果处理程序返回一个变量和一个模板:

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

其中enabled是一个布尔变量。

到目前为止,我知道我可以做以下事情:

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

在模板的 HTML 部分中。

但是我们可以在 Tornado 模板中基于这个enabled变量有条件地运行一些 javascript 代码吗?换句话说,我们可以在嵌入模板的javascript中访问这个变量的值吗?

4

1 回答 1

6

当然 - 模板中的任何内容{% if ... %}{ % end %}只会在if表达式为 True 的情况下发送到浏览器。因此,其中的任何内容,无论是<script >带有内联 javascript 的<link>标签,还是从某个地方导入 javascript 文件的标签,都只会在这种情况下通过网络传输。

您甚至可以在 Javascript 代码本身中放置一个模板iffor指令,以根据服务器代码已知的条件启用或禁用部分代码。我认为这个,unlinke embedding or not a whole piece of code,不会被认为是一个好的做法——因为它会以不受欢迎的方式纠缠代码的服务器端和客户端。

要从 javascript 访问变量,只需执行以下操作:

var 启用 = {{ 启用 }};

标记内的值{{...}}使用服务器变量呈现。

在这种情况下,为了确保 in 的值在enabledPython 和 Javascript 之间兼容,您应该使用数字 0 表示 False,使用数字 1 表示 True(因为如果您使用 Python 布尔值,模板将呈现为 var enabled = True;- 这不是 javascript 所期望的, 因为 Javascript 中保留的 "true" 是小写的)

唯一的限制是您只能在页面发送到浏览器之前设置服务器端变量。因此,如果您需要在服务器端设置任何取决于用户在所显示页面上的操作的任何变量,这种处理方式将不再适用(仅在页面重新加载时)。使页面在不重新加载的情况下进行交互更新的方法是依赖来自 javascript(以前专门称为“ajax”)的异步通信。

编辑- OP进一步询问:

这是一个问题:当我将诸如 myvar='foo-bar' 之类的字符串变量返回到模板时,并且在 JS 代码中评估此 {{myvar}} 时,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 回答